本篇采用nignx + gunicorn来部署django 应用
部署代码
部署前的项目配置
Django 项目中会有一些 CSS、JavaScript 等静态文件,为了能够方便地让 Nginx 处理这些静态文件的请求,我们把项目中的全部静态文件收集到一个统一的目录下,这个目录通常位于 Django 项目的根目录,并且命名为 static。为了完成这些任务,需要在项目的配置文件里做一些必要的配置:1
2
3
4
5
6
7blogproject/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
4blogproject/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
安装django1
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 | [Unit] |
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
到这里 服务应该就能正常跑起来了。