Nginx + Uwsgi + Pylons + Virtual Host

本文主要讲解如何利用nginx和uwsgi同时支持多个Python虚拟站点,单站点配置相关文档比较多,在这里不作介绍。一般来讲,要支持多个站点,需要满足下面几个条件:

起动uwsgi要加上--vhost参数,同时也可以加上--no-site,也就是不用系统的python库,全都使用virtualenv里的
你的应用要在一个python的virtualenv下
在nginx配置文件里针对每个站点指定相关的参数
同时,你的应用入口要定义一个application变量,一般是通过调用你的web框架相关函数返回的一个wsgi函数对象,例如Django,可以这样定义:

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

但是对于Pylons,配置单站点一般在uwsgi的起动参数里指定应用配置文件就行了,不需要定义一个application让uwsgi去找。但是在多站点情况下,相关参数是通过nginx配置文件传给uwsgi的,这样,只针对某一特殊框架的参数就不能在nginx配置文件里定义了。因此,对于pylons应用,也需要定义一个application。解决这个问题,可以在你的pylons应用的根目录下建一个app.py文件,然后在里面加入下面的代码:

from paste.deploy import loadapp
application = loadapp('config:/home/don/dev/envs/pylons/apps/helloworld/development.ini')

这样,pylons应用就可以像其它wsgi应用一样被uwsgi调用了。下面是uwsgi起动参数和nginx配置文件示例:

uwsgi -s :5000 -M -p 4 --vhost --no-site

location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:5000;
        uwsgi_param UWSGI_PYHOME /home/don/dev/envs/pylons;
        uwsgi_param UWSGI_CHDIR /home/don/dev/envs/pylons/apps/helloworld;
        uwsgi_param UWSGI_SCRIPT app;
        uwsgi_param SCRIPT_NAME "";
}

其中,UWSGI_PYHOME指定为你的virtualenv根目录,UWSGI_CHDIR指定为你的应用根目录,UWSGI_SCIPRT指定为你的含有applicaion定义的python模块,也就是之前新建的app.py,但不要.py后缀,最后一个参数SCRIPT_NAME指定为一个空字符串就行了,不指定的话会报错,其它除了pylons以外的框架不需要这个参数。另外,如果uwsgi起动时通过-M和-p参数指定了主从进程的话,要把你的development.ini配置文件里的debug设成false。

相关推荐