跳转到主要内容

如何通过Nginx+PSGI运行MovableType

Tony 提交于 周一, 2014-08-11 - 12:50

一个游戏在通关前我都说不上喜爱,随后所有的精诚法门敏捷操控总在我知道我能通关为前提下一一展现。例如贪吃蛇,全屏首尾相接是没有悬念的,区别只在后期食物和加分水果距离蛇头的位置,来决定通关后能够获得的差异的分数。这也是我喜欢网页设计的原因,反正最终是可以实(chao)现(xi)这个效果的,只是看要花多少时间走怎(pian)样(men)的路线罢了。

于是我又来折腾了,把TONYHEAD 通利堂从传统的Apache-cgi_module-CGI切换到Nginx-PSGI-CGI上。

先说说为什么要用PSGI来跑MovableType这个Perl应用,用过MT的都知道MT后台的反应是多么的龟速(短板不在硬件上),想达到WordPress后台那种按按按就出结果的节奏是不可能的,但亲测转到PSGI后效果有明显改善。根据测评,PSGI模式的效率是CGI模式的1.9倍,是FastCGI的1.4倍,在另一个测评中,PSGI的效率都在CGI的2倍以上,如图:

CGI vs PSGI

图片来源

总之切换到PSGI后效能的提升是显而易见的,下面开始介绍做法。

系统环境

Starman是一个PSGI网关,在MovableType 5.2开始支持Nginx+PSGI时进入视野,mt-starman-daemon作为守护进程会把 /cgi-bin/mt/ 目录先预读进内存,把该目录下的所有cgi/pl脚本交给Starman处理,Nginx则负责处理前端静态文件和转发Starman。在AWS市场里Nginx+MySQL+Starman是作为MovableType 6的标准配置,可见这一组合和思路是被推崇的。

步骤

OS部分

先安装cpanminus。

curl -L http://cpanmin.us/ | perl - App::cpanminus

安装Plack,XMLRPC和Starman,这一步需时较长,请耐心等待。

cpanm Task::Plack XMLRPC::Transport::HTTP::Plack Starman

下载mt-starman。

wget -P /etc/init.d --no-check-certificate http://raw.github.com/saahov/mt-starman-daemon/master/debian/mt-starman

把mt-starman设置为可执行。

chmod +x /etc/init.d/mt-starman

修改mt-starman中的配置,需要修改 DIR, SCRIPT, USER, GROUP, ERROR_LOG, PIDFILE 这几个地方。

vi /etc/init.d/mt-starman

把mt-starman加入自动启动。

update-rc.d mt-starman defaults

Nginx部分

Nginx安装的具体步骤网上都有,一键安装包LNMPAMH都是不错的选择。配置Starman需要在 /usr/local/nginx/conf/nginx.conf 里 http 括号内加入:

upstream starman {
server 127.0.0.1:50000;
}

在 /usr/local/nginx/conf/vhost/tonyhead.com.conf 里具体网站配置里的 server 括号内加入(注:我把MT的程序放到了tonyhead.com/web/cgi-bin/mt/里):

location /cgi-bin/mt/ {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://starman;
}

MovableType部分

修改config.cgi,加入:

PIDFilePath 上面 PIDFILE 的地方

最后启动Nginx和Starman

/etc/init.d/nginx restart && /etc/init.d/mt-starman start

如果在上面 ERROR_LOG 的地方看到log文件生成并有以下字样那就说明Starman已经正确启动了。

Process Backgrounded
2014/08/10-20:58:14 Starman::Server (type Net::Server::PreFork) starting! pid(14456)
Binding to TCP port 50000 on host 127.0.0.1 with IPv4

打扫工作

剩下一些小修小补的工作,例如rewrite规则的转换,在Rule convertor可以把Apache的规则自动转换为Nginx的版本。

除错

  1. 修改mt-starman中的 ERROR_LOG, PIDFILE ,注意目录权限,同样mt-config.cgi也需要更改PIDFILE的位置。
  2. MT 6.0.3的 lib/MT/PSGI.pm 281行favicon附近有bug会导致mt-starman起不来,于是我把279行到284行都注释掉了。更新:在6.0.4里已经修复。
  3. cgi-bin 下有增删改后要重启一下starman才能看到效果。
  4. 部分插件不能运行,特征是不在 /cgi-bin/mt/ 根目录下的以.cgi结尾的插件,例如 AccessCounter
  5. 因为运行在本地的Starman接管了脚本,所以所有评论都会来自127.0.0.1,令AntiSpam效果大打折扣。

相关链接

回到顶部

添加新评论

此字段内容将保密,不会被其他人看见。

Filtered HTML

  • 网页和电子邮件地址自动转换为链接。
  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <drupal-entity data-*>
  • 自动断行和分段。