1 简介
部署python的web应用常见的方式大体有2种:
fcgi:用spawn-fcgi或者框架自带的工具对各个project分别生成监听进程,然后和http服务互动。
wsgi:利用http服务的mod_wsgi模块来跑各个project。
uWSGI 为新的协议,兼容 wsgi的写法,性能高于上述协议。
2 部署nginx
首先安装nginx:
debian(ubuntu等):
sudo apt-get install nginx
centos:
sudo yum install nginx
安装后,配置nginx:
用vim等编辑器打开/etc/nginx/nginx.conf,有一些版本的nginx将conf配置文件放到了/etc/nginx/conf或/etc/nginx/site-enabled中。
加入以下server负责转发请求给之后的uwsgi
server {
listen 80;
server_name xxx.com;#需要监听的域名或ip
location / {
uwsgi_pass 127.0.0.1:8010;#8010为uwsgi工作的端口
include uwsgi_params;#nginx转发的uwsgi的http头
access_log /var/www/xx/log/nginx.log;#nginx日志文件
}
}
完成后重启nginx
sudo service nginx restart
3 部署uwsgi
3.1 安装uwsgi
由于uwsgi更新较快,而且uwsgi较为轻量,1分钟即可编译完成,因此官方没有提供编译好的二进制文件。
可以使用pip进行安装,简单快捷,推荐。
sudo pip install uwsgi
安装后跳到 3.2 配置uwsgi
此外我们也可以到
http://uwsgi-docs.readthedocs.org/en/latest/Download.html 下载,解压后,自行编译。
编译前,配置编译环境
debian:
sudo apt-get install build-essential python
sudo apt-get install python-dev
centos:
sudo yum groupinstall "Development Tools"
sudo yum install python
sudo yum install python-devel
python uwsgiconfig.py --build
编译后会得到uwsgi可执行文件,将其复制到/usr/sbin/文件夹中
cp ./uwsgi /usr/sbin
至此安装完成
3.2 配置uwsgi
uwsgi具有很多工作模式,我们使用其中的emporer模式。即uwsgi启动后,自动读取/etc/uwsgi/下的web应用配置文件,并启动相应的web应用。
为uwsgi建立service,并开机自动启动,将下列内容写入/etc/init.d/uwsgi文件(需新建),设置YOURNAME变量为你的非root的用户名。
### BEGIN INIT INFO
# Provides: uwsgi
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts uwsgi Server
# Description: Starts uwsgi Server
### END INIT INFO
<span style="font-size:18px;">YOURNAME = XX #将XX替换为你的用户名</span>
case "$1" in
start)
nohup uwsgi --emperor /etc/uwsgi/ --uid $<span style="font-family: Arial, Helvetica, sans-serif;">YOURNAME</span><span style="font-family: Arial, Helvetica, sans-serif;"> --gid $</span><span style="font-family: Arial, Helvetica, sans-serif;">YOURNAME </span><span style="font-family: Arial, Helvetica, sans-serif;">&</span>
;;
restart)
killall uwsgi && <span style="font-family: Arial, Helvetica, sans-serif;">nohup uwsgi --emperor /etc/uwsgi/ --uid $</span><span style="font-family: Arial, Helvetica, sans-serif;">YOURNAME</span><span style="font-family: Arial, Helvetica, sans-serif;"> --gid $</span><span style="font-family: Arial, Helvetica, sans-serif;">YOURNAME </span><span style="font-family: Arial, Helvetica, sans-serif;">&</span>
;;
run)
uwsgi --emperor /etc/uwsgi/ --uid $YOURNAME --gid $YOURNAME &
;;
stop)
killall uwsgi
;;
*)
echo "Usage: /etc/init.d/uwsgi {start|stop|run|restart}"
exit 1
;;
esac
修改文件权限
sudo chmod 755 /etc/init.d/uwsgi
新建并进入/etc/uwsgi文件夹
sudo mkdir /etc/uwsgi
cd /etc/uwsgi
每个web应用需要建立一个ini配置文件,示例如下:
[uwsgi]
socket = 127.0.0.1:9000
chdir = /var/www/xxx #你的python web应用的主目录
pythonpath = ..
module = wsgi #python web应用中含有application可调用函数的python模块,不用写.py扩展名
processes = 1 #进程数,一般和处理器核心数量相同
threads = 2 #线程数,一般是进程数乘2
daemonize = /var/www/xx/log/uwsgi.log #日志文件
其中module需要符合wsgi规范,含有一个原型为application(environ,start_response)的可调用对象。具体规范查看我的另一篇转发的文章。
完成后执行
sudo service uwsgi start
启动uwsgi即可