Django自带的开发者运行模式,是不适合直接运行在生产环境的。
所以需要一个WSGI server来正式部署和运行Django项目,我的选择是Gunicorn。
当然作为web入口的web server,我选择了非常流行的Nginx,使其直接服务静态文件的请求,并且转发动态请求给后端Gunicorn服务。
为了让Gunicorn的保持运行状态,在其停止后可自动拉起,所以选择了supervisor这个进程管理工具。
为了在服务器上构建独立的python运行环境,所以选择了virtualenv。
当然,数据库还是选择我的老朋友MySQL,在CentOS 7.2 系统上可以yum直接安装mariadb。至于MySQL和mariadb的细节差别,对我来说无关紧要。
关于 Django+MySQL+Gunicorn+Supervisor+Virtualenv 这个技术栈的环境搭建配置,主要还是参考:
http://zqpythonic.qiniucdn.com/data/20130901152951/index.html
这里只提几点注意事项:
1. 生产环境,Django需要关闭debug模式
1 2 3 |
DEBUG = False TEMPLATE_DEBUG = False ALLOWED_HOSTS = ['*'] |
2. 使用supervisor来管理进程,不要启动daemon模式,所以我设置了gunicorn的“daemon=False”
3. 上面那个参考文档中的,supervisor使用的.conf结尾的配置文件,但我在CentOS中yum安装的supervisord要求是使用.ini结尾的配置。
以为它的supervisord.conf中配置有:
1 2 |
[include] files = supervisord.d/*.ini |
4. nginx上让静态资源直接由nginx服务而不需要走gunicorn,我使用了try_files这个指令:
1 2 3 4 |
location / { # checks for static file, if not found proxy to app try_files $uri @proxy_to_app; } |
5. 在CentOS 7.2 上,我使用的一些命令:
1 2 3 4 5 6 7 8 |
pip install Django gunicorn sudo yum install -y epel-release sudo yum install -y nginx mariadb supervisor sudo supervisorctl reload sudo supervisorctl avail sudo supervisorctl status my_app sudo supervisorctl start my_app |
6. virtualenv是个好东西,virtualenv入门推荐这2篇:
http://kuanghy.github.io/2015/12/04/virtualenv
http://pythonguidecn.readthedocs.io/zh/latest/dev/virtualenvs.html