环境:
centos 7.0 :
[root@judge soft]# cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)
[root@judge soft]# uname -r
3.10.0-123.9.3.el7.x86_64
nginx 1.8.0 编译安装
[root@judge ~]# cd /usr/local/nginx/sbin/
[root@judge sbin]# ls
nginx
[root@judge sbin]# ./nginx -v
nginx version: nginx/1.8.0
uwsgi: uwsgi --version
uwsgi -version 可看到更多的内容
[root@judge soft]# uwsgi --version
2.0.11.2
python 2.7.5
django :
>>> import django
>>> django.__version__
'1.8.2'
原理: client 发送http请求----经过nginx------uwsgi----django----Nosql mysql 可用两张图来说明
基于软件的发展:
在过去Python的Web服务器的解决方案基本上只有mod_wsgi。其中最流行的(或理解为时尚)的方法是最近Gunicorn
如今nginx和uwsgi结合,在基于 Python的Web应用程序上你能获得在线程(或非线程)之上更好的性能体验。暂且先这么认为吧。
WSGI:
wsgi:web server gateway interface 。It is a specification for web servers and application servers to communicate with web applications (though it can also be used for more than that) WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx)与应用服务器(如uWSGI服务器)通信的一种规范。
uWSGI
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。
- WSGI,是一种通信协议。
- uwsgi同WSGI一样是一种通信协议。
- 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。
为什么有了uWSGI为什么还需要nginx?因为nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。
验证uwsgi
django-admin.py startproject aaa_pj
cd /opt/aaa_pj/aaa_pj/
vi test.py
#!/usr/bin/env python
#coding:utf-8
def application(env,start_response):
start_response('200 OK',[('Content-Type','text/html')])
return "Hello World
uwsgi --http :8001 --wsgi-file /opt/aaa_pj/aaa_pj/test.py 打开浏览器 ip:8001 出现hello world 则说明uwsgi安装没有问题
python /opt/aaa_pj/manage.py runserver 0.0.0.0:82 验证django
连接django和uwsgi
编写django_wsgi.py文件,将其放在与文件manage.py同一个目录下。
#!/usr/bin/env python
#coding:utf-8
import os
import sys
#将系统的编码设置成UTF8
reload(sys)
sys.setdefaultencoding('utf8')
os.environ.setdefault("DJANGO_SETTINGS_MODULE","aaa_pj.settings")
uwsgi --http :8002 --chdir /opt/aaa_pj/ --module django_wsgi
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()
uwsgi --http :8002 --chdir /opt/aaa_pj/ --module django_wsgi
但是到这样一步,网页始终无法打开,
暂且先不管
设置uwsgi与Nginx连接
nginx配置:
uWSGI 配置
前面我们是直接使用命令行来启动 uWSGI,在实际部署环境中,我们常用的是配置文件的方式,而非命令行的方式。
我的 Django 程序目录:/opt/aaa_pj/
这里让 Nginx 采用 8088 端口与 uWSGI 通讯,请确保此端口没有被其它程序采用。
uWSGI 支持多种配置文件格式,比如 xml,ini,json 等等都可以。
1. xml 配置
请确定你在上一节中的django_wsgi.py文件已经存在了。新建一个XML文件:aaa_pj.xml,将它放在 /opt/aaa_pj 目录下
<uwsgi>
<socket>127.0.0.1:8088</socket>
<listen>80</listen>
<master>true</master>
<pythonpath>/opt/aaa_pj</pythonpath>
<processes>1</processes>
<logdate>true</logdate>
<daemonize>/var/log/uwsgi.log</daemonize>
<plugins>python</plugins>
</uwsgi>
执行命令:uwsgi -x /opt/aaa_pj/aaa_pj.xml
or /usr/
local
/bin/uwsgi -x /opt/aaa_pj/aaa_pj.xml
结果报错了:
[root@judge aaa_pj]# uwsgi -x /opt/aaa_pj/aaa_pj.xml
[uWSGI] parsing config file /opt/aaa_pj/aaa_pj.xml
open("./python_plugin.so"): No such file or directory [core/utils.c line 3675]
!!! UNABLE to load uWSGI plugin: ./python_plugin.so: cannot open shared object file: No such file or directory !!!
根据提示 我将xml文件里的 plugin那行删除,结果再执行就没有报错了
[root@judge aaa_pj]# vi aaa_pj.xml
[root@judge aaa_pj]# uwsgi -x /opt/aaa_pj/aaa_pj.xml
[uWSGI] parsing config file /opt/aaa_pj/aaa_pj.xml
此时我重启nginx 又报错了
[root@judge sbin]# ./nginx
nginx: [emerg] unknown log format "/opt/logs/access.log" in /usr/local/nginx/conf/nginx.conf:43
根据提示 不能用=号
server {
listen 80;
server_name localhost;
access_log /opt/logs/access.log;
error_log /opt/logs/error.log;
location / {
uwsgi_pass 127.0.0.1:8088;
include /usr/local/nginx/conf/uwsgi_params;
}
access_log off;
}
再启动nginx就没有报错了。
由于前面的错误,网页没有成功打开。因此还需要仔细找找原因。
加载指定的xml配置文件。当使用命令行参数时,可以使用简化命令“-x”。当然也可以不简写:
甚至如果在命令行的最后一个参数以“.xml”结尾,那么就隐含将加载该xml文件作为配置。
有时候因各种环境问题,-x --xml 命令识别不了,可以使用下面的 ini 配置方式:
2. ini 配置
然后执行命令:
vhost
=
false
plugins
=
python
socket
=
127.0
.
0.1
:
8088
master
=
true
enable
-
threads
=
true
workers
=
1
wsgi
-
file
=
/opt
/opt
_pj
/opt
_pj
/
wsgi.py
chdir
=/opt
/opt
_pj
/
然后执行命令:
uwsgi --ini /root/nowamagic_venv/nowamagic_pj.ini&