用uwsgi和nginx来跑moinmoin

抽了点时间把Woodpecker的wiki放到了uWSGINginx下来了,中间有一个小地方折腾了我好几趟,所以记一下。安装之类的就不说了。

在Nginx里配置了uwsgi_pass之后,访问wiki一直会多带过去/moin这个url_prefix,所以默认的设置对于wiki放在根下的人来说可能什么都不用动。我以为是uwsgi处理的时候是把/moin也当成一个页来处理的。所以就想着把/moin从$request_uri里直接拿掉,把后面的部分传给uwsgi。

if ( $request_uri ~ ^/moin(.*)?) {
set $wiki_uri $1;
}
uwsgi_param REQUEST_URI $wiki_uri;

这条路不通啊。中间还试过其他的参数,跳开不说了,最后在uWSGI的wiki:RunOnNginx里有一句关键的话

The WSGI standard says that the SCRIPT_NAME is the var used to select a specific application. The “uwsgi_modifier1 30” option set the UWSGI_MODIFIER_MANAGE_PATH_INFO. This per-request modifier instructs the uWSGI server to rewrite the PATH_INFO value removing the SCRIPT_NAME from it.

所以直接在Nginx的conf里这样写

uwsgi_param SCRIPT_NAME /moin;
uwsgi_pass unix:///tmp/woodpecker.moin.sock;
uwsgi_modifier1 30;

就可以了。这三句应该和Apache里的 WSGIScriptAlias /moin/ /path/to/moin.wsgi是一致的。

uWSGI的性能看起来不错,不过我还没有做什么测试,也没有数据佐证,凭感觉说一下而已。Nginx的文档里什么也没留下来,这一点很不好。不过Nginx的文档一直很烂。

Updating: 抽出了点时间看了一下,大概比apache+mod_wsgi快了1.5倍以上。下面是Moinmoin的timer数据。

item    apache+wsgi nginx+uwsgi
Page.execute    1.933   0.807
Page.execute|1  1.808   0.732
Page.execute|2  1.047   0.446
getPageList     0.251   0.014
init    0.048   0.006
load_multi_cfg  0.031   0
run     2.481   0.981
send_page   2.462   0.972
send_page_content   1.938   0.813
send_page_content|1     1.834   0.762
send_page_content|2     1.096   0.501
send_page|1     1.847   0.773
send_page|2     1.119   0.522
total   2.529   0.988


Last modified on 2010-10-26