# 将动态请求转发到uwsgi跑的django程序
location / {
uwsgi_pass django;
include /path/to/your/mysite/uwsgi_params; # 从github上下载的uwsgi_params 文件路径
}
}
你也可以把这个配置文件放在项目路径中,然后建立一个链接到nginx配置文件夹:
sudo ln -s ~/path/to/your/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/
部署静态文件
在部署服务器之前,需要先将Django的静态文件部署到静态文件夹中,首先,编辑django网站的settings.py文件
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
然后,运行以下命令
python manage.py collectstatic
4 启动服务
在启动nginx之前,我们需要先启动uWSGI,进入项目目录然后输入以下命令,在这里我们使用unix套接字方式:
#注:django1.6 前的版本需要手动添加wsgi.py
uwsgi --socket mysite.sock
如果nginx和uwsgi跑在同一台服务器上,使用unix套接字就可以了,unix套接字方式性能要高很多,但不能跨机器访问。当nginx和uWSGI不在一台服务器上时,就需要使用TCP端口方式(别忘了更改nginx配置文件,取消相应注释):
uwsgi --socket :8001 --module mysite.wsgi --chmod-socket=664
接下来,启动nginx服务器,就可以访问django站点了。
5 使用ini配置文件跑uWSGI
到这里,我们已经把nginx+uWSGI+Django跑起来了,但uWSGI的参数比较多的时候,每次都要输入非常麻烦,这时,我们可以在django项目目录下建立一个mysite.uwsgi.ini
[uwsgi]
# 项目根目录路径(full path)
chdir = /path/to/your/project
# Django的 wsgi 文件
module = mysite.wsgi
# virtualenv目录 (full path)
home = /path/to/virtualenv
master = true
# 最大工作进程数(CPU密集型建议设为CPU核心数,IO密集型建议设为CPU核心数的两倍)
processes = 16
# unix套接字文件路径
socket = /path/to/your/project/mysite.sock
# socket文件权限
# chmod-socket = 664
# 退出时清空环境
vacuum = true
然后,直接根据配置文件运行uwsgi即可:
uwsgi --ini mysite.uwsgi.ini
6 管理uwsgi
Emperor模式
uWSGI的Epreror模式可以用来管理机器上部署的uwsgi服务,在这种模式下,会有一个特殊的进程(皇帝)对其它部署的服务(诸侯)进行监视。我们将所有配置文件(ini或xml文件,如上一节中的mysite.uwsgi.ini)统一放到一个文件夹(如:/etc/uwsgi/vassals)中,然后启动Emperor模式:
uwsgi --emperor /etc/uwsgi/vassals
这样,就会自动读取文件夹中的配置文件,并自动监控这些uwsgi服务: - 检测文件夹中有新的配置文件时,会启动新的uwsgi服务实例 - 检测到一个配置文件发生改变,会自动重启该服务 - 检测到一个配置文件被移除,则自动停止该服务 - 如果一个服务死了(诸侯),皇帝进程会重启该服务 - 如果监控进程(皇帝)死了,所有服务(诸侯)都会停止
用systemd管理uwsgi服务
配合Eperor模式,在centos、fedora、archlinux中,我们可以用systemd来管理uwsgi,首先,创建一个systemd service文件(/etc/systemd/system/emperor.uwsgi.service)
[Unit]
Description=uWSGI Emperor
After=syslog.target
[Service]
ExecStart=/root/uwsgi/uwsgi --emperor /etc/uwsgi/vassals
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
这样我们就可以用systemd来管理uwsgi服务了。启动服务:
$ systemctl start emperor.uwsgi.service
查询服务运行状态:
$ systemctl status emperor.uwsgi.service
停止服务
systemctl stop emperor.uwsgi.service
Linux系统中,还有一种通用的方法,就是在init.d 或 rc.d 中加入启动脚本,这种方式不够智能,而且网上资料很多,在这里暂不讨论。
7 常用参数和选项
关于参数的具体使用,可以阅读官方文档 ,在这里列出一些常用的参数:
chdir 项目目录
home virtualenv目录(如没有运行virtualenv虚拟环境,则无需设置)
socket 套接字文件或TCP套接字,例如:site1.uwsgi.sock 或 127.0.0.1:8000
uid 用户id
gid 用户组id
processes 工作进程数
harakiri 进程超过该时间未响应就重启该进程(默认单位为秒)
module 要启动的wsgi模块入口,如:mysite.wsgi:application
ini 指定ini配置文件
xml 指定xml配置文件(与ini类似)
file 指定要运行的wsgi程序文件,如:test.py
emperor Emperor模式
so-keepalive 开启TCP KEEPALIVE(unix套接字方式下无效)
vacuum 退出时清空环境
更多参考
Nginx+uWSGI+Supervisor在Ubuntu上部署Flask应用
uWSGI+Django+Nginx的工作原理流程与部署过程
Nginx+uWSGI+Django+Python 应用架构部署
Ubuntu Server 14.04.2 LTS 配置 Nginx + Uwsgi + Django