http://www.nowamagic.net/academy/detail/1330334
上一篇介绍了 uWSGI 来部署 Django 程序,但在在生产环境中单单只有 uWSGI 是不够的,Nginx是必不可少的工具。
先安装 Nginx,可以参照前面的小节:使用RPM安装Nginx。
Nginx 配置
在 nginx.conf 上加入/修改,我的 server 配置如下(一切从简……):
03 |
server_name 115.28 . 0.89 ; |
06 |
access_log / home / nowamagic / logs / access.log; |
07 |
error_log / home / nowamagic / logs / error.log; |
11 |
uwsgi_pass 127.0 . 0.1 : 8077 ; |
13 |
include / etc / nginx / uwsgi_params; |
注意保证配置里写的目录 /home/nowamagic/logs/ 和 /home/nowamagic/logs/ 存在,接下来就没啥问题了,Nginx 配置很简单。
uWSGI 配置
前面我们是直接使用命令行来启动 uWSGI,在实际部署环境中,我们常用的是配置文件的方式,而非命令行的方式。
我的 Django 程序目录:/root/nowamagic_venv/nowamagic_pj/
这里让 Nginx 采用 8077 端口与 uWSGI 通讯,请确保此端口没有被其它程序采用。
uWSGI 支持多种配置文件格式,比如 xml,ini,json 等等都可以。
1. xml 配置
请确定你在上一节中的django_wsgi.py文件已经存在了。新建一个XML文件:nowamagic_pj.xml,将它放在 /root/nowamagic_venv/nowamagic_pj 目录下
02 |
<socket> 127.0 . 0.1 : 8077 < / socket> |
05 |
<pythonpath> / root / nowamagic_venv / nowamagic_pj< / pythonpath> |
06 |
<processes> 1 < / processes> |
07 |
<logdate>true< / logdate> |
08 |
<daemonize> / var / log / uwsgi.log< / daemonize> |
09 |
<plugins>python< / plugins> |
然后执行命令:
1 |
uwsgi -x /root/nowamagic_venv/nowamagic_pj/nowamagic_pj.xml |
3 |
/usr/ local /bin/uwsgi -x /root/nowamagic_venv/nowamagic_pj/nowamagic_pj.xml |
加载指定的xml配置文件。当使用命令行参数时,可以使用简化命令“-x”。当然也可以不简写:
1 |
uwsgi --xml /etc/nowamagic.xml |
甚至如果在命令行的最后一个参数以“.xml”结尾,那么就隐含将加载该xml文件作为配置。
1 |
uwsgi /etc/nowamagic.xml |
有时候因各种环境问题,-x --xml 命令识别不了,可以使用下面的 ini 配置方式:
2. ini 配置
04 |
socket = 127.0 . 0.1 : 8077 |
08 |
wsgi - file = / root / nowamagic_venv / nowamagic_pj / nowamagic_pj / wsgi.py |
09 |
virtualenv = / root / nowamagic_venv |
10 |
chdir = / root / nowamagic_venv / nowamagic_pj |
然后执行命令:
1 |
uwsgi --ini /root/nowamagic_venv/nowamagic_pj.ini& |
uwsgi 这样就启动起来了。如果无意外的话,就能在网上访问你的 Python 项目了。
小插曲
我在配置完 Nginx 和 uWSGI 之后,访问时显示 502 错误。查看 uWSGI 启动信息,发现这么一条:ImportError: No module named django.core.wsgi。
然后推断,我的 CentOS 上的 Python 版本是 2.4.3,然后进入 virtualenv,执行:
3 |
<<< from django.core.wsgi import get_wsgi_application |
则没报错,因为我的虚拟环境里的 Python 版本是 2.7.5。推断成立,但是虚拟环境里的 Django 会默认调用外部环境的 Python。解决方法:在虚拟环境里 pip install django。
OK,问题解决,一切正常。
附
一些我在配置时用到的命令,省得你去搜索:
1. 关闭 uWSGI:
2 |
killall -s HUP /var/www/uwsgi |
3 |
killall -s HUP /usr/ local /bin/uwsgi |
2. 列出端口占用情况: