web服务器可以直接向用户提供图片、html等静态文件,但不能直接与Django中的python代码交互,所以在它们之间还需要一个中间人来将浏览器的请求传给python代码,并将python的执行结果返回给服务器去响应浏览器的请求。这个中间人就是WSGI,WSGI规定了一些服务器与python代码交互的接口,更像一种协议,而uWSGI是WSGI的一种实现。
本文要实现的一个请求/响应流程如下图所示:
web client <---> nginx <---> socket <---> uwsgi <---> django
1、web client <---> nginx
这个流程跟django没有关系,主要是保证nginx是正常的。
安装:
yum install nginx -y
安装成功后,启动nginx,然后在通过浏览器访问:http:127.0.0.1,如果没问题的话,会看到成功的提示页面,如果有不清楚的错误,可以通过tail -f /var/log/nginx/error.log来查看。
其他相关的常用命令:rpm -ql nginx:查询nginx的安装路径
systemctl start nginx:启动nginx
systemctl restart nginx:重启nginx
systemctl satus nginx:查询nginx运行状态
netstat -apn|grep nginx:查询nginx占用的端口
可能会遇到nginx.pid没有权限/不存在的问题,这可能是因为nginx没启动,或没有权限去读nginx.pid,运行ps -ef|grep nginx看一下当前nginx程序是否是以nginx用户启动的,如果是的话,应该就是权限问题了,可以把nginx.conf中的user nginx改为user root,然后重启nginx。
2、uwsgi <---> django
这个流程跟nginx没关系,主要是测试uwsgi是否安装正确。
安装:
下载:uwsgi-2.0.10.tar.gz,解压,然后运行python uwsgiconfig.py --build,安装完成。uwsgi的官方doc
以下用于测试的Django工程名为DjangoDemo,其结构如下图所示:
接下来运行uwsgi --http :8080 --module DjangoDemo.wsgi。然后通过浏览器访问http://127.0.0.1:8080。如果没问题的话,会显示DjangoDemo工程的首页。
3、通过socket把nginx和uwsgi连起来,即:nginx <---> socket <---> uwsgi
修改nginx配置文件:
vim /etc/nginx/nginx.conf
第一种配置:
upstream django {
#server unix:///root/workspace/DjangoDemo/demo.socket; # for a file socket
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
server {
listen 8000 default_server;
location / {
uwsgi_pass django;
include /etc/nginx/uwsgi_params;
}
}
确定nginx正常,然后运行uwsgi --socket :8001 --module DjangoDemo.wsgi。如果没有问题的话,通过浏览器访问http://127.0.0.1:8000会看到DjangoDemo的首页。
如果因为socket端口而报错,可以尝试关掉SELINUX:
vi /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存退出
setenforce 0 #使配置立即生效
第二种配置:借助socket文件
upstream django {
server unix:///root/workspace/DjangoDemo/demo.socket; # for a file socket
#server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
server {
listen 8000 default_server;
location / {
uwsgi_pass django;
include /etc/nginx/uwsgi_params;
}
}
运行uwsgi --socket demo.socket --module DjangoDemo.wsgi,然后在DjangoDemo的目录下会看到一个空的demo.socket文件。正常的话,通过浏览器访问http://127.0.0.1:8000会看到DjangoDemo的首页。如果有权限问题,尝试运行uwsgi --socket demo.socket --module DjangoDemo.wsgi --chmod-socket=664。
至此,整个流程就走通了。
参考:
http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html
http://segmentfault.com/q/1010000002492487
http://uwsgi-docs.readthedocs.org/en/latest/Install.html