uWSGI是为Python语言定义的通用网关接口,它承担python web框架(django、flask、web.py等)和web服务器(nginx、apache、lighttpd等)之间的中间层。
浏览器 chrome、firefox、ie等
|
web服务器 nginx、apache等
|
网关接口 CGI、FastCGI、WSGI等
|
Python(程序、Web框架) Django、Flask、Tornado等
python中自带的wsgiref就是一种wsgi接口的标准实现,但是,由于100%使用python实现等原因,导致wsgiref实在过于缓慢,只能用于测试和学习。生产环境中我们需要使用性能更高的服务器,目前常用的wsgi服务器有:uWSGI、Gunicorn、twisted.web。
1 uWSGI的安装
uWSGI是用C语言写的高性能WSGI服务器,安装uWSGI前我们需要安装Python和C编译器(GCC)。推荐使用python包管理器pip安装uWSGI。
#安装最新稳定版
pip install uWSGI
#也可以安装长期支持版(LTS版本)
#pip install
在Ubuntu下可以使用apt-get来安装
apt-get install uwsgi
yum groupinstall "Development Tools"
yum install python
编译安装,从github下载uwsgi代码,cd到目录下
python uwsgiconfig.py --build
2 测试uwsgi是否安装成功
在终端中输入以下命令查看uwsgi的版本号,如果输出正常,说明uswgi已安装成功
$ uwsgi --version
2.0.11.1
我们可以编写一个简单的wsgi应用来测试uwsgi是否被安装成功,首先创建一个test.py文件:
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
#return ["Hello World"] # python2
运行uwsgi:
uwsgi --http :8000 --wsgi-file test.py
参数中,http :8000表示使用http协议,端口号为8000,wigi-file则表示要运行的wsgi应用程序文件。uwsgi运行后打开浏览器,访问:8000/ ,或者是相应服务器地址的8000端口,就可以看到hello world 页面了。
上面的例子中,我们用浏览器直接访问了uwsgi运行的python程序(只有一个入口函数的wsgi测试应用test.py),其访问结构如下所示。
浏览器 <-> uWSGI <-> Python
上述方式运行uWSGI服务的过程中,可以使用CTRL+C即可停止服务,在后续的章节中会讲到自动管理和部署。
3 nginx和django的配置
nginx和django的安装不是本文的重点,故在此略去,只讨论配置部分。在这里,我们要实现的效果如下:
浏览器 <-> nginx <-> uWSGI <-> Django(python)
uwsgi_params 配置文件
uWSGI使用的协议不完全是标准的WSGI协议,我们需要从Github下载uwsgi_paraments配置文件,并将该文件拷贝到项目路径中(例如:/user/home/pengquanxin/projects/mysite1/)。
Nginx服务器配置
接下来,要配置nginx服务器和uWSGI互通,可以使用unix套接字方式和TCP端口方式。在nginx配置文件夹(/etc/naginx/site-enabled 或 /usr/local/etc/nginx/sites-enabled)中新建网站的配置文件mystie_nginx.conf,输入以下内容:
# mysite_nginx.conf
# nginx需要连接的上游
upstream django {
server unix:///path/to/your/mysite/mysite.sock; # 使用unix套接字
#server 127.0.0.1:8001; # 使用TCP端口请注释上一行,并取消本行注释,这里的端口指的是跑uwsgi的端口
}
# nginx服务器配置
server {
# 监听端口
listen 80;
# 域名
server_name .example.com;
# 编码
charset utf-8;
# 最大上传大小
client_max_body_size 75M;
# Django 的media路径
location /media {
alias /path/to/your/mysite/media;
}
# 静态文件路径
location /static {
alias /path/to/your/mysite/static;
}