Django 项目线上部署

一、安装环境

1. yum 安装可能需要的依赖包

1
yum install zlib-devel bzip2-devel epel-release nginx libffi-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make -y

2. 升级Sqlte3

因为Django需要更高版本的Sqlite,而系统自带的不满足条件,报错如下

django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).

1
2
3
# 创建一个download文件夹,后续的文件都放在这里,为了方便管理
mkdir /root/download
cd /root/download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cd /root/download
# 下载源码
wget https://www.sqlite.org/2019/sqlite-autoconf-3290000.tar.gz
# 编译
tar zxvf sqlite-autoconf-3290000.tar.gz
cd sqlite-autoconf-3290000/
./configure --prefix=/usr/local
make && make install

# 替换系统低版本 sqlite3
mv /usr/bin/sqlite3 /usr/bin/sqlite3_old
ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3
echo "/usr/local/lib" > /etc/ld.so.conf.d/sqlite3.conf
ldconfig
sqlite3 -version

3. 安装Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cd /root/download
# 下载python3.7
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
# 解压
tar xvf Python-3.7.0.tar.xz
# 进入
cd Python-3.7.0
# 编译
./configure --with-ssl --prefix=/usr/local/python3
make && make install
# 其中--prefix是Python的安装目录
# 加上–with-ssl参数,默认安装的软件涉及到ssl的功能才可用,比如pip的更新
# 安装完成之后 建立软链接 添加变量 方便在终端中直接使用python3
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3
#Python3安装完成之后pip3也一块安装完成,不需要再单独安装
#同样给pip3建立软链接
ln -s /usr/local/python3/bin/pip3.7 /usr/bin/pip3

4. 安装virtualenv

这一步是为了创建python的虚拟环境,方面管理python环境

1
2
3
4
5
6
7
8
9
10
# 因为需要经常使用虚拟环境,所以放在一个简单的地方
cd /root
# 安装
pip3 install virtualenv
# 创建虚拟环境
virtualenv -p python3 py37env
# 启动环境
source py37env/bin/activate
# 停止环境
deactivate

5. 安装 uwsgi

1
2
3
pip3 install uwsgi
# 给uwsgi建立软链接,方便使用
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi

uwsgi需要安装两次,先在系统里安装一次,然后进入对应的虚拟环境安装一次。

6. 安装 Django项目依赖包

部署到线上环境,需提前在开发环境执行 pip freeze > requirements.txt 命令

1
2
cd 你的项目requirements.txt所在目录
pip install -r requirements.txt

二、配置一下uwsgi

先确保项目能跑起来,下面的配置方式任选一种

第一种:XML格式的配置文件

我们网站项目路径是 /data/wwwroot/mysite/,在项目根目录下创建
mysite.xml文件,输入如下内容:

1
2
3
4
5
6
7
<uwsgi>    
<socket>127.0.0.1:8000</socket> <!-- 内部端口,自定义 -->
<chdir>/data/wwwroot/mysite/</chdir> <!-- 项目路径 -->
<module>mysite.wsgi</module> <!-- mysite为wsgi.py所在目录名-->
<processes>4</processes> <!-- 进程数 -->
<daemonize>uwsgi.log</daemonize> <!-- 日志文件 -->
</uwsgi>

保存
注意里的mysite,为wsgi.py所在的目录名。

这种方式的配置,可以用下面的命令启动.

1
2
3
4
5
6
#启动uwsgi
uwsgi -x mysite.xml
#uwsgi有没有启动成功,可以用下面的命令查看
ps -ef|grep uwsgi
#如果想重启uwsgi,先使用下面的命令杀掉进程,再启动uwsgi
killall -9 uwsgi

第二种:ini格式的配置文件

在项目文件里创建 uwsgi.ini 文件,编辑文件 ,设置uwsgi属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#添加配置选择
[uwsgi]
#配置和nginx连接的socket连接
socket=127.0.0.1:8000
#配置项目路径,项目的所在目录
chdir=/data/wwwroot/mysite/
#配置wsgi接口模块文件路径,也就是wsgi.py这个文件所在的目录名
wsgi-file=mysite/wsgi.py
#配置启动的进程数
processes=4
#配置每个进程的线程数
threads=2
#配置启动管理主进程
master=True
#配置存放主进程的进程号文件
pidfile=uwsgi.pid
#配置dump日志记录
daemonize=uwsgi.log`

通过下面的命令启动运行uwsgi

1
uwsgi  --ini  uwsgi.ini

显示 [uWSGI] getting INI configuration from uwsgi.ini 表明uwsgi运行成功

可能通过ps -ef|grep uwsgi 查看确认是否uwsgi启动.

ini配置文件其它相关命令:

1
2
3
4
#停止运行uwsgi,通过包含主进程编号的文件设置停止项目
uwsgi --stop uwsgi.pid
#重启uwsgi
uwsgi --reload uwsgi.pid

三、配置 nginx

nginx一般默认安装好的路径为/usr/local/nginx
在/usr/local/nginx/conf/中先备份一下nginx.conf文件,以防意外。

1
cp nginx.conf nginx.conf.bak

然后打开nginx.conf,将文件内容替换为以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/

user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;

include /etc/nginx/mime.types;
default_type application/octet-stream;

# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;

################################
server{
listen 80;
server_name 127.0.0.1:80;
charset utf-8;
access_log off;
location /static {
alias /root/test_django/mysite/static/; #要与之前django的setting.py中添加的static静态文件转移目录一致
}
location / {
uwsgi_pass 127.0.0.1:8000; #端口与原来的uwsgi中设置的端口一致,在第5步设置
include /etc/nginx/uwsgi_params;
}
}
################################

要留意备注的地方,要和UWSGI配置文件mysite.xml,还有项目路径对应上。
执行./nginx -t命令先检查配置文件是否有错,没有错就执行以下命令:

1
nginx

四、测试Django程序

1
2
3
4
5
6
7
8
9
# 启动nginx
/usr/sbin/nginx
# 启动uwsgi
uwsgi -x /home/python_project/DjangoFan/socket.xml
# 强制关闭
sudo pkill -f uwsgi -9
sudo pkill -f nginx -9
# 重启nginx
nginx -s reload

访问网站地址:ip:80,访问成功:

image-20220106114825566