ngx_http_uwsgi_module模块

ngx_http_uwsgi_module模块允许把请求传递给uwsgi服务器。
配置示例:

location / {
    include uwsgi_params;
    uwsgi_pass localhost:9000;
}

传递到uWSGI服务器的参数

被传递到uWSGI服务器的请求头是以参数形式提供的,例如,User-agent头将会通过HTTP_USER_AGENT参数来传递,除了HTTP请求头之外,还可以通过uwsgi_param指令来传递任意参数。

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

uwsgi的启动模式


使用配置(!!!vhost模式!!!)

下面这个例子中,由单个uwsgi后台服务器实例提供了多个主机名称 和 单个主机有多个应用的情况

upstream uwsgi_host
{
    server 127.0.0.1:1088;
}

include uwsgi_params;
uwsgi_param SCRIPT_NAME           $app;
uwsgi_param UWSGI_MODULE          $app;
uwsgi_param UWSGI_CALLABLE        "${app}_handler";
uwsgi_param UWSGI_PYHOME          $document_root;
uwsgi_param UWSGI_CHDIR           $document_root;
uwsgi_modifier1                   30; #properly sets PATH_INFO variable

server
{
    server_name   foo;
    root   /var/www/foo;

    location /app1/
    {
        set   $app   app1;
        uwsgi_pass   127.0.0.1:1088;
    }

    location /app2/
    {
        set   $app   app2;
        uwsgi_pass   127.0.0.1:1088;
    }
}

server
{
    server_name   bar;
    root   /var/www/bar;

    location /app1/
    {
        set   $app   app1;
        uwsgi_pass   uwsgi_host;
    }

    location /app3/
    {
        set   $app   app3;
        uwsgi_pass   uwsgi_host;
    }
}

在这个配置文件中提供了两个域名foo和bar,每个域名下都有两个应用。
在这个配置中使用了uwsgi协议的两个参数:SCRIPT_NAMESERVER_NAMESERVER_NAMEuwsgi_params文件中被映射,而SCRIPT_NAME被明确地传递到uWSGI服务器,这是因为在uWSGI的vhost应用名册上将键值设定为"host|script"格式
具有相同的主机和相同的脚本名称的请求,才会交给相同的应用程序来处理。
如果没有提供脚本名称,那么就会为空,另外,第一次访问该脚本时首先会被初始化。
这是第一次访问:

WSGI application 2 (SCRIPT_NAME=bar|app3) ready on interpreter 0x8272860 pid: 21532
bar [pid: 21532|app: 2|req: 1/10] 192.168.3.248 () {50 vars in 770 bytes} [Thu Jul 21 19:12:03 2011] GET /app3/ => generated 4 bytes in 20 msecs (HTTP/1.1 200) 1 headers in 45 bytes (0 switches on core 0)

这是第二次访问:

bar [pid: 21527|app: 2|req: 2/11] 192.168.3.248 () {50 vars in 770 bytes} [Thu Jul 21 19:12:07 2011] GET /app3/ => generated 4 bytes in 0 msecs (HTTP/1.1 200) 1 headers in 45 bytes (0 switches on core 0)

以下是三个app:
app1.py

def app1_handler(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return b'app1'

app2.py

def app2_handler(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return b'app2'

app3.py

def app3_handler(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return b'app3'

例子中出现的uwsgi参数的说明:


如何正确设置PATH_INFO

nginx传递给uwsgi的PATH_INFO的值为uwsgi_param指令设置的PATH_INFO的值从第len(SCRIPT_NAME)个字符开始的部分(其中len(SCRIPT_NAME)为SCRIPT_NAME的值的长度)。
比如:SCRIPT_NAME被设置为app1,PATH_INFO被设置为$document_uri,那么在访问/app1的时候,nginx传递给uWSGI的PATH_INFO的值为"1";而如果PATH_INFO被设置为$script$document_uri,那么在访问/app1的时候,nginx传递给uWSGI的PATH_INFO的值为/app1


参考资料