先简单介绍下nginx、uwsgi、django分别是什么,nginx是web服务器擅长处理静态请求,uwsgi也是一个web服务器擅长处理动态请求,django是python的一个web框架,nginx+uwsgi+django是生产环境中常见的部署搭配,客户端发起一个http请求后首先被nginx接收并分析请求,如果是动态请求nginx则通过socket把请求转向uwsgi去处理,uwsgi处理结束后再返回给nginx,nginx再返回给客户端,如果是静态请求,nginx则自行处理并将处理结果直接返回个客户端,这样基本上完成了一个完整的请求过程。
首先确保服务器上已经安装好python、django等且已经建立了一个可执行的项目,如果这一步还没有完成,请先自行去完成django的安装已经项目建立,可通过 python manage.py runserver 命令来检验项目是否完整建成。本文中将以wechat为django项目名称,目录为 /usr/share/nginx/html/wechat,这个目录是为网站二级域名配置的一个站点目录,网站一级域名站点目录为 /usr/share/nginx/html。
pip install uwsgi 安装uwsgi,安装成功后,使用 uwsgi --http :8000 --wsgi-file wechat/wsgi.py 来确认uwsgi是否能正常启动web服务(注意wechat要换成自己的项目名称,并确认文件位置正确),uwsgi支持通过 ini 等配置文件来启动的,所以我们将使用配置文件来启动uwsgi,项目目录下新建一个目录script(这个随意自己,也可以不用,为了方便管理,只要确认文件位置正确就行),在新目录script下新建 uwsgi.ini 配置文件,配置内容如下
# uwsig使用配置文件启动
[uwsgi]
# 项目目录
chdir=/usr/share/nginx/html/wechat/
# 指定项目的application
module=wechat.wsgi
# 指定sock的文件路径
#socket=:8000
# 指定IP端口
http=:8000
# 启用主进程
master=true
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
buffer-size=32768
这是主要的配置项,还有更多的配置,暂不考虑,这些足以能正常启动uwsgi了,这里需要注意的一点的是,前面提到过uwsgi也是一个web服务器同样能完成nginx的工作,在这里nginx并不是必要的,但是为了生产环境的性能和服务稳定经常和nginx搭配使用,nginx和uwsgi使用socket来保持联系,因此如果想单独使用uwsgi作为web服务器或者测试uwsgi服务器的话,上面配置项中的socket需要改为http,等配好了nginx,又必须要改回socket连接。现在使用 uwsgi --ini uwsgi.ini 来启动uwsgi服务(注意配置文件的实际位置及当前目录位置),正常的话uwsgi服务以及起来了,可以在浏览器中访问测试,大家可以把配置项中的http改为socket来测试下,改成socket的话页面就不能正常访问了。
接下来配置nginx,nginx的安装就不多说了,安装成功后,找到nginx配置文件,一般在 /etc/nginx/ 或 /etc/nginx/conf.d/ 目录下,由于我前面有提到过,我是在nginx下配置了两个站点,配置项都在 /etc/nginx/conf.d/default.conf中,其他情况大家可以在nginx配置文件的同级目录下新建一个你项目的nginx配置文件,比如新建一个wechat.conf,只要确保能被nginx正常加载就行,这里的nginx配置文件比较简单,
server {
listen 80;
server_name wechat.weatherfood.com;
root /usr/share/nginx/html/wechat;
include /etc/nginx/default.d/*.conf;
location / {
root /usr/share/nginx/html/wechat;
index index.php index.html index.htm;
uwsgi_pass 127.0.0.1:8000;
include /etc/nginx/uwsgi_params;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
重点是这两个配置项,确认uwsgi_params文件位置正确就行,其中uwsgi_pass就是nginx与uwsgi保持联系的关键配置
uwsgi_pass 127.0.0.1:8000;
include /etc/nginx/uwsgi_params;
配置好nginx后,service nginx reload 重启下nginx,同时确认uwsgi.ini中socket配置项是开启而http配置项是关闭的,同时重启下uwsgi服务,至此nginx、uwsgi、django的环境部署已经完成。
在以上整个过程中肯定会碰到各种问题,我自己也是折腾了一天才部署好,写下这边文章主要记录下大致流程。
还有一个问题,uwsgi我们是通过配置文件来启动的,虽然可以使用后台运行命令,这样其实并不方便,能不能加入到系统服务里面去呢,就像nginx那样一个service就都可以搞定,在这里我们使用 supervisor来管理uwsgi进程,需要注意的是目前 supervisor 不支持python3 ,安装并配置好 supervisor后我们可以使用类似supervisorctl -c /etc/supervisord.conf start wechat 这样的命令来管理uwsgi服务了,关于supervisor的具体配置并不复杂请自行去研究,但需要注意的是更改了supervisor配置后需要重启才能生效。
这就是nginx+uwsgi+django环境部署的完整流程了,过程写的比较粗糙,需要特别注意的地方基本都提到了,文中有不对的地方也请各位雅正,如果在部署的过程中有问题,也欢迎交流。