抽了点时间把Woodpecker的wiki放到了uWSGI和Nginx下来了,中间有一个小地方折腾了我好几趟,所以记一下。安装之类的就不说了。
在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