uwsgi简介
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。
WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。
uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。
Nginx和uWSGI都是Web服务器,Nginx负责静态内容,uWSGI负责Python这样的动态内容,二者配合共同提供Web服务以实现提高效率和负载均衡等目的。uWSGI在实际环境中,主要和nginx一起使用,这时作为django 与 nginx 的中间件。请求和响应的流程如下:
Request > Nginx > uWSGI > Django > uWSGI > Nginx > Response
请求先交由Nginx,如果是静态内容就自己处理了,如果是动态内容就交给uWSGI服务器,uWSGI服务器处理整个Django项目的Python代码,响应请求,原路返回,但是与fastcgi不同,Nginx、uWSGI和Django可以独立部署,然后整合。
1、安装各类基础模块
yum install gcc-c++ -y
(为centos系统增加编译功能)
yum install wget openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel -y
(安装这些模块都是为了成功编译安装python3,防止出现各种异常)
yum install libxml* -y
(安装这个模块是为了让uwsig支持使用“-x"选项,能通过xml文件启动项目)
2、编译安装python3
wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz
tar -zxf Python-3.6.6.tgz
cd Python-3.6.6
./configure --prefix=/usr/local/python3
make && make install
配置pip源:
tee /etc/pip.conf <<EOF
[global]
index-url = http://pypi.douban.com/simple
trusted-host = pypi.douban.com
[list]
format=columns
EOF
创建软连接:
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
(以上两个ln命令是为了方便在终端中直接使用python3和pip3命令)
3、给python3安装django和uwsgi以及配置启动项目文件
pip3 install "django>=1.11,<2.0"
pip3 install uwsgi
建立软连接
ln -s /usr/local/python3/bin/django-admin /usr/bin/django-admin
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi3
使用django-admin创建Django项目
[root@node3 project]# django-admin startproject myproject
[root@node3 myproject]# cd myproject
[root@node3 myproject]# python3 manage.py startapp myapp
测试uwsgi是否正常
创建测试文件test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b'Hello World']
基于HTTP协议运行uWSGI,如果uWSGI安装正常的话,可以在浏览器中访问8001端口,看到Hello world字样
uwsgi3 --http :8001 --wsgi-file test.py
在你的django项目下(与manage.py同一目录)新建uwsgi.ini ,内容如下:
vim /project/myproject/uwsgi.ini
[uwsgi]
socket=127.0.0.1:8000
chdir=/project/myproject
module=myproject.wsgi
master=true
processes=4
threads=2
buffer-size=60000
vacuum=true
其中module=myproject.wsgi表示/project/myproject/uwsgi.ini
运行uwsgi:
nuhup uwsgi3 --ini uwsgi.ini &
4、安装nginx和配置nginx.conf文件
yum install epel-release nginx -y
vim /etc/nginx/nginx.conf
server {
listen 8996;
server_name localhost;
charset utf-8;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000; #与uwsgi通信的地址
}
}
nginx -t
service nginx start
在浏览器访问http://IP:8996即可显示django项目主页
注意:
如果服务器是映射的,nginx配置文件里面的server_name要写外网的IP或者域名
若是uwsgi运行正常,nginx运行也正常,但就是连接不起来,可以检查下系统是否开启了selinux,需要关闭它才行。
不要在python虚拟环境中使用uwsgi,会有一些问题,当然也可以解决,参考:https://stackoverflow.com/questions/14194859/importerror-no-module-named-django-core-wsgi-for-uwsgi