MoinMoin 与 Nginx, fastcgi 与 uwsgi 的配置

给自己架了个Wiki http://wiki.ptsang.net作为自己的知识管理工具。虽然这个博客本来就是工具之一,也累积了快两年了,但经常碰到有些小东西,不值得为之写篇博客,很有用,但用完就忘记。个人wiki适合做写细小的笔记,当累积一定的时候还可以整理成博客。

Wiki我选择了用Python的MoinMoin,一定程度上受CPYUG社区 ZoomQuiet 大妈的推荐影响,首次试用感觉非常impresive,所以就定了。再加上 GraphViz 工具的支持,实在的强大。

在vps上服务,肯定是无视apache的,内存有限。之前架设过用来上Twitter奶瓶腿,是Nginx + php-cgi的方案,nginx是必须的。

Python跟web前端的架构方式有太多选择了,五花八门,MoinMoin的发行包里面都提供了moin.cgi moin.scgi moin.ajp moin.fcgi moin.wsgi等多种启动方式。MoinMoin里面全部通过内置的flup作为中间件提供这些接口,目前我仅尝试使用了fastcgi和wsgi。

虽然解压了moin的源码包就可以直接运行里面的wikiserver.py来本地访问了,但在服务器上通常是由nginx/lighttpd等服务来综合转发。php的话是通过spawn-fcgi启动一些php-cgi的进程,服务器接受到动态的请求就通过本地socket跟php-cgi通讯,返回的结果展现回给客户。php-cgi是使用FastCGI协议的。

MoinMoin 源码当中wiki/server/moin.fcgi就是一个类似php-cgi功能的fastcgi服务,类似地可以使用spawn-fcgi来启动moin.fcgi,作为后端的处理进程。

Running MoinMoin Wiki with Nginx via FastCGI and Flup该文章很形象解释了fastcgi的角色,以及提供了一段很方便的服务脚本来启动spawn-fcgi

Client ----> Nginx Web Frontend -----------+
                                           | fastcgi_pass
                                          \|/
                            +-------------------------+
              moin.fcgi     | spawn-fcgi-moin.socket  |
spawn-fcgi ---------------> |           or            |
                            |     localhost:port      |
                            +-------------------------+

但是文章当中的nginx配置不完整,而且复杂了,这是我的配置:

server {
        listen   80; ## listen for ipv4
        server_name  wiki.apt-blog.net;
 
        access_log  /var/log/nginx/wiki.apt-blog.net.access.log;
        error_log   /var/log/nginx/wiki.apt-blog.net.error_log;
 
        location / {
                include fastcgi_params;
                fastcgi_param PATH_INFO $fastcgi_script_name;
                fastcgi_param SCRIPT_NAME /;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                if (!-f $request_filename) {
                        fastcgi_pass unix:/var/run/spawn-fcgi-moin.socket;
                }
        }
}

当然那文章中的配置有考虑对静态文件直接由nginx服务,不通过flup这一层,有一定优化,这里省去了这些。其实增多一个/moin_static193(据版本号不同而不同)的location即可,可参考后面使用uwsgi做服务时候的配置。

文章还提到wikiconfig.py里面一个fix_script_name变量,是1.9版本新加入的,需要xxx.com/wiki这样访问的童鞋就不用像以前版本那样要在nginx配置里面写一大堆东西了。

Fastcgi就这么多,不算太复杂。Fastcgi虽然很流行,但弊端不少,首先是速度,在一台虚拟机上测试,用ab居然跑出每秒20个请求的速度……虽然平均下来还是有5、60次,但真的,唉。php-cgi还支持产生多个工作进程以并行和均衡请求,提高效率,fastcgi似乎就没这样的东西了。

刚好这天observer专栏杂记写了一篇配置Nginx+uwsgi更方便地部署python应用,当中也提到fcgimod_python的各种不便,然后介绍了uwgi,高性能、多应用。

uwgi充当了python解析器的角色,使用wsgi的接口和Python程序交互,这个过程中做了优化,和上层nginx之间则设计了更加轻量的协议。nginx0.8.40以后官方默认带了uwgi的协议模块,所以使用很方便。

uwgi的文档有些简略,但是重点都是在wiki/Example里面了。 MoinMoin在uwgi的配置在其中一句带过:

/usr/bin/uwsgi -s /tmp/moin.sock --wsgi-file wiki/server/moin.wsgi -M -p 4

uwgi的-w参数是把某个py文件作为module,import使用,但是wsgi文件不被认识,所以新版里面多了这么个--wsgi-file参数。但是如果是多站点呢!

nginx配置的虚拟主机里面的uwsgi_param UWSGI_SCRIPT参数会让uwgi按模块导入名称,相当于命令行里面的-w,但是moinmoin的moin.wsgi文件,不是py结尾,只能用--wsgi-file参数。扫了一圈uwgi的wiki/ExampleRunOnNginx,都没提到这个问题,倒是在这里提到在旧版的uwgi当中没有--wsgi-file参数,需要把wsgi文件改名成py结尾来导入,好吧,确实那样成功了。

至于性能,一开始我发现uwgi占的内存也不少,一个worker时候就占了20M多的内存,所以没开更多的工作进程;Fastcgi也差不多,然后用Apache Benchmark测试,好像两者区别不大。于是看了下fcgi vs. gunicorn vs. uWSGI的测评,才发现uwgi要开多个worker进程才有性能!于是开了8个,性能出来了,秒请求马上就上千! 显然是uwgi打开了多个进程,充分利用了机器的CPU,还做了均衡请求。

最后,我的Wiki使用uwgi后的nginx配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
    server_name  wiki.apt-blog.net;
    access_log  /var/log/nginx/wiki.apt-blog.net.access.log;
    error_log   /var/log/nginx/wiki.apt-blog.net.error_log;
    location / {
        include uwsgi_params;
        #uwsgi_pass 127.0.0.1:9096;
        uwsgi_pass unix:///tmp/uswgi.sock;
        uwsgi_param UWSGI_PYHOME /usr/local/lib/moinmoin;
        uwsgi_param UWSGI_CHDIR /var/local/wiki-moinmoin/server;
        uwsgi_param UWSGI_SCRIPT moin_wsgi;
    }
    location /moin_static193/ {
        alias /usr/local/lib/moinmoin/lib/python2.6/site-packages/MoinMoin/web/static/htdocs/;
    }
}

完整配置指南:

#安装
sudo -s
add-apt-repository ppa:nginx/stable
add-apt-repository ppa:uwsgi/release
apt-get update
apt-get install nginx uwsgi-python python-virtualenv
 
#组件配置
cat >/etc/uwsgi-python/apps-enabled/uwsgi.xml << EOF
<uwsgi>
  <limit-as>256</limit-as>
  <processes>6</processes>
  <memory-report/>
  <vhost/>
  <no-site/>
</uwsgi>
EOF
 
cat >/etc/nginx/sites-enabled/moinmoin << EOF
server {
    listen   80;
    access_log  /var/log/nginx/wiki.access_log;
    error_log   /var/log/nginx/wiki.error_log;
 
    client_max_body_size 64;
    server_name wiki.mydomian.com;
    location / {
                include uwsgi_params;
                uwsgi_pass unix:///var/run/uwsgi-python/uwsgi/socket;
                uwsgi_param UWSGI_PYHOME /var/www/moinmoin/python-home/;
                uwsgi_param UWSGI_CHDIR /var/www/moinmoin/;
                uwsgi_param UWSGI_SCRIPT moin_wsgi;
                uwsgi_param UWSGI_SCHEME $scheme;
                uwsgi_param REMOTE_USER $remote_user;
        }
}
EOF
 
#Python环境预备
mkdir /var/www/moinmoin
virtualenv /var/www/moinmoin/python-home
cd /tmp
wget http://static.moinmo.in/files/moin-1.9.3.tar.gz
tar xvfz moin-1.9.3.tar.gz
source /var/www/moinmoin/python-env/bin/activate
cd /tmp/moin-1.9.3
python setup.py install
deactivate
 
#MoinMoin环境
cp -r /tmp/moin-1.9.3/wiki /var/www/moinmoin
cd /var/www/moinmoin/wiki
cp config/wikiconfig.py wikiconfig.py
cp server/moin.wsgi moin_wsgi.py
sed -i '/# a2)/isys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))'
 
#可选
rm -rf config server
 
#重启
/etc/init.d/nginx restart
/etc/init.d/uwsgi-python restart
文章分类 Python, Unix/Linux 标签: , , , , ,
15 comments on “MoinMoin 与 Nginx, fastcgi 与 uwsgi 的配置
  1. BOYPT说道:

    Test Comment~~

  2. 这些我都不懂。随便看看

  3. Insion说道:

    uwsgi有Windows版就好了,最近在Windows下搞东搞西的就差这家伙没有~

  4. muxueqz说道:

    求moin安装后的配置,怎样才能让moin漂亮些,更易用?

  5. alswl说道:

    “需要把wsgi文件改名成py结尾来导入”,很奇怪,官方wiki都没提到。不过的确如此

  6. 孤狗说道:

    看来MoinMoin的富文本编辑器确实没法用啊,即使换了IE也不行,一点都不方便,经常卡死。

    • BOYPT说道:

      用wiki还写富文本本来就蛋疼死了~

      不过1.9.4的编辑器组件升级了,可以试试看

  7. zenir说道:

    hi PT大牛
    add-apt-repository ppa:uwsgi/release
    导入然后update
    出现http://ppa.launchpad.net/uwsgi/release/ubuntu/dists/precise/main/source/Sources 404 Not Found
    :-)何解 求赐教。

    • BOYPT说道:

      估计是因为你的Ubuntu版本,目前uwsgi的ppa只提供了lucid, maverick和natty;不知道oneric 等版本是不是已经进入官方源了。

  8. Great blog here! Also your website loads up fast!
    What host are you using? Can I get your affiliate link to your host?

    I wish my website loaded up as fast as yours lol

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*