uWSGI+nginx部署python及django应用

来源:互联网 发布:如何关闭mac日历 编辑:程序博客网 时间:2024/06/06 00:16

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 pythonsudo apt-get install python-dev

centos:

sudo yum groupinstall "Development Tools"sudo yum install pythonsudo 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/uwsgicd /etc/uwsgi

每个web应用需要建立一个ini配置文件,示例如下:

[uwsgi]socket = 127.0.0.1:9000chdir = /var/www/xxx #你的python web应用的主目录pythonpath = ..module = wsgi #python web应用中含有application可调用函数的python模块,不用写.py扩展名processes = 1 #进程数,一般和处理器核心数量相同threads = 2 #线程数,一般是进程数乘2daemonize = /var/www/xx/log/uwsgi.log #日志文件

其中module需要符合wsgi规范,含有一个原型为application(environ,start_response)的可调用对象。具体规范查看我的另一篇转发的文章。

完成后执行

sudo service uwsgi start

启动uwsgi即可







0 0