Django应用-3-项目迁移线上的服务器部署及环境分离

完成了初步的项目开发之后,需要将项目迁移到线上服务器,对服务器进行配置及项目初始化,需要进行如下步骤的操作:

  • 安装Python3
  • 安装git服务
  • 安装nginx
  • 安装django
  • uWSGI + nginx配置
  • 开发环境、测试环境、生产环境使用不同配置信息

本文将以上各步骤的操作实录及遇到的坑记录下来以作备忘:

1、安装python3

服务器内默认带的是python2,需要手动安装python3。

1.1、先安装依赖包

yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel

1.2、获取安装包

先进到server的目录下:

cd  /www/server

使用wget命令获取安装包,具体的地址可以上python官网获取,本例是截止到目前为止的最新的稳定版的安装包:

wget https://www.python.org/ftp/python/3.10.4/Python-3.10.4.tgz

之后,解压安装包:

tar -zxvf Python-3.10.4.tgz

1.3、安装python3

配置安装路径,为:/usr/local/python3

cd Python-3.10.4
./configure prefix=/www/server/python3

编译&安装python3

make && make install

添加软链接,让python3和pip3指向刚刚安装的python3.10:

ln -s /www/server/python3/bin/python3.10 /usr/bin/python3
ln -s /www/server/python3/bin/pip3.10 /usr/bin/pip3

1.4、检验python3是否安装成功

python3 -V
pip3 -V

2、安装git服务

2.1、安装git

yum install git 

2.2、创建一个git用户,用来运行git服务

adduser git

2.3、初始化仓库,假定是在/www/gitroot/mathworld:

git init —bare mathworld.git

2.4、因为服务器上的Git仓库存粹是为了共享,所以不让用户直接登录到服务器上去改工作区,所以将owner修改为git:

chown -R git:git mathworld.git

2.5、禁用shell登录

处于安全考虑,之前创建的git用户不允许登录shell,通过编辑/etc/passwd文件完成,找到:

git:x:1001:1001:,,,:/home/git:/bin/bash

改为:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

2.6、创建证书登录

将每个需要登录用户的公钥,也就是他们的id_rsa.pub文件,导入到/home/git/.ssh/authorized_keys 内

在需要登录人员的PC内输入:

cd ~/.ssh
cat id_rsa.pub

获取到公钥,将其放到/home/git/.ssh/authorized_keys内,在服务器上:

cd /home/git
mkdir .ssh
chmod 700 .ssh
cd .ssh
touch authorized_keys
chmod 600 authorized_keys

2.7、将项目拷贝过来

在应用目录下:

git clone git@localhost:/www/gitroot/mathworld/mathworld.git

如果需要更新,直接用:

git pull

3、安装nginx

系统内已经自带了,本文不再赘述。

4、安装django

4.1、使用pip直接安装

pip3 install --index-url https://pypi.douban.com/simple/ django

以上指令利用了国内的douban的镜像,因为国外源拉数据比较慢。

4.2、填坑之openssl版本过低

输入4.1的命令后,系统报错,详情及截图如下:

pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
openssl报错

原因是openssl版本太低了,查看openssl的版本号:

openssl version -a

结果发现是1.0.2版本:

openssl版本号1

那么就需要升级OpenSSL,首先下载安装包:

wget https://www.openssl.org/source/openssl-1.1.1n.tar.gz
tar -zxvf openssl-1.1.1n.tar.gz
cd openssl-1.1.1n

接下来编译安装:

./config --prefix=/usr/local/openssl no-zlib #不需要zlib
make
make install

对原配置进行备份:

mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl/ /usr/include/openssl.bak

设置新版本的配置:

ln -s /usr/local/openssl/include/openssl /usr/include/openssl
ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/local/lib64/libssl.so
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl

修改系统配置:

## 写入openssl库文件的搜索路径
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
## 使修改后的/etc/ld.so.conf生效
ldconfig -v

重新安装python:

./configure prefix=/www/server/python3 --with-openssl=/usr/local/openssl
make && make install

参考文章:https://blog.csdn.net/lkgCSDN/article/details/84403329

4.3、创建站点

django-admin startproject mathworld

创建user模块:

python3 manage.py startapp user

4.4、安装其他依赖

安装pymysql:

pip3 install --index-url https://pypi.douban.com/simple/ pymysql

安装django-simple-captcha:

pip3 install --index-url https://pypi.douban.com/simple/ django-simple-captcha

5、配置uWSGI + nginx

WSGI(Web Service Gateway Interface),是一种web服务器网关接口,它是一种web服务器与web应用通信的一种规范,当前运行在WSGI协议之上的Web框架有:Bottle、Flask、Django。

uWSGI是一个web服务器,它实现了WSGI协议,用于接收前端服务器转发的动态请求,并处理后发给web应用程序。

在此例中,我们使用python的Django框架开发了一个web应用,将其挂到网站上,nginx作为代理服务器,负责静态资源发送、动态请求转发,以及结果的回复;uWSGI作为后端服务器,负责接受nginx转发过来的请求并处理后发给django应用。过程如下图:

uWSGI服务器的链路说明

uWSGI官网上的配置文档写的非常清楚,可以直接按照它所述进行配置:https://uwsgi.readthedocs.io/en/latest/tutorials/Django_and_nginx.html

在配置过程中遇到了如下两个坑:

5.1、pip安装uwsgi报错

从网上搜索相关问题,大部分都说是没有安装python3-devel依赖导致的,可是我安装后依然报错。

后来,发现是因为我安装了新版本的openssl,但是yum自带的openssl没有卸载掉,运行:

yum remove openssl-devel
# 查看当前的版本
openssl version

完美解决问题!

参考文档:https://blog.csdn.net/rongDang/article/details/102871874

5.2、注意权限

当错误日志记录:

connect() to unix:///path/to/your/mysite/mysite.sock failed (13: Permission
denied)

那么需要修改权限:

uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666 # (very permissive)
或者是
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=664 # (more sensible)

6、开发环境、生产环境、测试环境使用不同配置

6.1、目录结构

在settings.py同级目录下创建settings目录。

在settings目录下面新建如下文件:

6.2、将settings里面除了数据库、debug,其余的内容都复制到base.py内

6.3、在develop、qa、product里面:

from .base import *

并加入database和debug的信息。

6.4、修改BASE_DIR

BASE_DIR = Path(__file__).resolve().parent.parent.parent

BASE_DIR为项目的根目录,为base文件所在目录的上级的上级。

6.5、修改wsgi和manage.py

wsgi.py:

env = 'develop'
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mathworld.settings.%s' % env)

manage.py:

env = 'develop'
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mathworld.settings.%s' % env)

6.6、设置git的.ignore文件,忽略manage.py和wsgi.py:

在项目根目录下:

vim .gitignore

# 输入如下内容
manage.py
./project_name/wsgi.py

通过以上操作,完成了将django项目部署到服务器上的操作。

Leave a comment

Your email address will not be published. Required fields are marked *