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 标签: , , , , ,
19 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

  9. Hi to every body, it’s myy firet pay a quick visit of thhis webpage;
    this wwblog contauns amazing and in fact fine stuff in favor of visitors.

  10. Good web site you’ve got here.. It’s hard to fnd good quality writing
    like yours nowadays. I truly appreciate people luke you!

    Take care!!

  11. I do agree with all of the ideas you have
    presented in your post. They are really convincing
    and can certainly work. Nonetheless, the posts are very brief for newbies.
    May you please extend them a little from next time?

    Thank you for the post.

  12. I’m really inspired with your writing talents
    as neatly as with the format for your blog. Is
    that this a paid theme or did youu modify it your self?
    Either wayy stay up the nice quality writing, it’s rare
    tto look a nice blog like this one these days..

发表评论

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

*