使用Gunicorn 部署Django

本篇采用nignx + gunicorn来部署django 应用

部署代码

部署前的项目配置

Django 项目中会有一些 CSS、JavaScript 等静态文件,为了能够方便地让 Nginx 处理这些静态文件的请求,我们把项目中的全部静态文件收集到一个统一的目录下,这个目录通常位于 Django 项目的根目录,并且命名为 static。为了完成这些任务,需要在项目的配置文件里做一些必要的配置:

1
2
3
4
5
6
7
blogproject/settings.py
# 其他配置...
STATIC_URL = '/static/'
# 加入下面的配置
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

STATIC_ROOT 指明了静态文件的收集目录,即项目根目录(BASE_DIR)下的 static 文件夹。

为了安全起见,在生产环境下需要关闭 DEBUG 选项以及设置允许访问的域名。打开 settings.py 文件,找到 DEBUG 和 ALLOWED_HOSTS 这两个选项,将它们设置成如下的值:

1
2
3
4
blogproject/settings.py
DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1', 'localhost ', '.mixoo.cn']

ALLOWED_HOSTS 是允许访问的域名列表,127.0.0.1 和 localhost 是本地访问的域名,.mixoo.cn 是访问服务器的域名(换成你自己的域名)。域名前加一个点表示允许访问该域名下的子域名,比如 www.mixoo.cn、test.mixoo.cn 等二级域名同样允许访问。如果不加前面的点则只允许访问 mixoo.cn。

项目还会依赖一些第三方 Python 库,为了方便在服务器上一次性安装,我们将全部依赖写入一个叫 requirements.txt 的文本文件中。激活本地的虚拟环境(如果你使用了虚拟环境的话),并进入项目的根目录,运行 pip freeze > requirements.txt 命令:

1
pip freeze > requirements.txt

将代码从git库拉到服务器

1
git pull origin master

创建virtual 运行环境

1
virtualenv --python=/usr/bin/python3 venv

激活虚拟环境

1
. venv/bin/activate

安装django

1
pip install django

如果配置了mysql并碰到找不到mysqlclient的问题,参考这里

收集静态文件

1
python manage.py collectstatic

使用Gunicorn

Gunicorn 一般用来管理多个进程,有进程挂了Gunicorn 可以把它拉起来,防止服务器长时间停止服务,还可以动态调整 worker 的数量,请求多的时候增加 worker 的数量,请求少的时候减少。

在虚拟环境下,安装 Gunicorn:

1
pip install gunicorn

自启动Gunicorn

服务器使用的是ubuntu 16.04,使用了systemd来管理自启动,使用脚本编写请按照自己的发行版格式,比如upstart等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description = GuoWang Web
[Service]
User=ubuntu
Group=www-data
Restart=on-failure
Environment=PATH=/home/ubuntu/guowang/guowang
WorkingDirectory=/data/myproject
ExecStart=/usr/bin/python3 /home/ubuntu/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 guowang.wsgi:application
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

Restart=on-failure保证进程中断会被自动重启
Environment=PATH=/data/myproject/myprojectenv/bin这里可以设置一些额外的环境变量
WorkingDirectory相当于chdir
ExecStart最重要部分,需要在开机时运行的命令。这次我们使用了socket文件而不是网络端口来与nginx通信,这样可以避免每个进程占用一个端口。
最后[Install]字段中的WantedBy=multi-user.target类似upstart脚本中指定runlevel=[2345]的作用,保证脚本在开机时自动执行。

脚本放置到/etc/systemd/system下
然后 激活脚本:

1
systemctl enable gw

激活后,使用start命令启动脚本:

1
systemctl start gw

查看服务是否正确运行:

1
systemctl status gw

如果服务正确运行了,就会有如下的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
● gw.service - GuoWang Web
Loaded: loaded (/etc/systemd/system/gw.service; enabled; vendor preset: enabled)
Active: active (running) since 三 2018-03-28 18:33:54 CST; 6s ago
Main PID: 19122 (gunicorn)
Tasks: 4
Memory: 83.8M
CPU: 801ms
CGroup: /system.slice/gw.service
├─19122 /home/ubuntu/venv/bin/python3 /home/ubuntu/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 guowang.wsgi:application
├─19126 /home/ubuntu/venv/bin/python3 /home/ubuntu/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 guowang.wsgi:application
├─19128 /home/ubuntu/venv/bin/python3 /home/ubuntu/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 guowang.wsgi:application
└─19129 /home/ubuntu/venv/bin/python3 /home/ubuntu/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 guowang.wsgi:application
3月 28 18:33:54 VM-141-106-ubuntu systemd[1]: Started GuoWang Web.
3月 28 18:33:54 VM-141-106-ubuntu gunicorn[19122]: [2018-03-28 18:33:54 +0800] [19122] [INFO] Starting gunicorn 19.7.1
3月 28 18:33:54 VM-141-106-ubuntu gunicorn[19122]: [2018-03-28 18:33:54 +0800] [19122] [INFO] Listening at: http://127.0.0.1:8000 (19122)
3月 28 18:33:54 VM-141-106-ubuntu gunicorn[19122]: [2018-03-28 18:33:54 +0800] [19122] [INFO] Using worker: sync
3月 28 18:33:54 VM-141-106-ubuntu gunicorn[19122]: [2018-03-28 18:33:54 +0800] [19126] [INFO] Booting worker with pid: 19126
3月 28 18:33:54 VM-141-106-ubuntu gunicorn[19122]: [2018-03-28 18:33:54 +0800] [19128] [INFO] Booting worker with pid: 19128
3月 28 18:33:54 VM-141-106-ubuntu gunicorn[19122]: [2018-03-28 18:33:54 +0800] [19129] [INFO] Booting worker with pid: 19129

到这里 服务应该就能正常跑起来了。