MT-Dispatch Configuration

| 0 Comments | 0 TrackBacks

前言

升级到Apache2以后,查阅了一些文档,不少人推荐用mod_fcgid来取代mod_fastcgi,据说能获得性能上的提升。国人写的fcgid据说同mod_fastcgi全兼容,同时做了一些改进。所以,决定尝试一下用fcgid来加速MovableType的cgi程序。但是,fcgid已经有一段时间没有更新了,一些apache用户论坛建议使用sourceforge上的cvs中的mod_fcgid,其中包含了一些更新。

各种不同的Linux版本安装fcgid的方法略有差异,但是,成功安装完fcgid后,还是有一些配制过程需要注意的。fcgid的配制中有不少陷阱,我经过了反复尝试,终于让fcgid正常运行起来了。

陷阱一: 启动fcgid时的配制

安装好fcgid模块后,重新启动apache服务器之前,需要指定正确的配制文件,Include下面 文件到httpd.conf中,能够正常的启动apache服务,其中两个重要的选项是SocketPath和SharememPath, 缺少任何一项,都会造成apache不能正常启动,而且,指定的目录需要设置成同apache进程同一个用户,好让apache能够读写该目录中的内容。

 <IfModule mod_fcgid.c>
   AddHandler fcgid-script .fcgi
   IPCConnectTimeout 40
   IPCCommTimeout 300
   DefaultInitEnv RAILS_ENV production
   SocketPath /var/lib/fcgid/fcgidsock
   SharememPath /var/lib/fcgid/fcgidshm
</IfModule>

陷阱二:需要为每个虚拟主机或每个IfModule配制项目单独指定fcgid参数

按照上面的配制,虽然能够正常的启动apache服务了,但是,并不代表fcgid能够正常的工作。如果需要让fcgid能够正常的工作,还需要为每个虚拟主机配制单独指定配置参数,fcgid并不能自动的继承上面的参数。在尝试正确配制Apache2+fcgid,发现,不但需要在每个虚拟主机配制中需要重新设定参数,甚至在需要在每个IfModule fcgid_module中都需要重新指定fcgid的配制选项,通过google查到文章重点说明了这一点。解决了这个问题之后,MovableType终于能够稳定的运行在fcgid下了。建议单独设定一个包含公共配制项目的文件,在需要的地方Include该文件,以免重复。

配制MT-Dispatch

fcgid能够正常工作之后,开始尝试用MT-Dispatch管理MovableType的进程,参考了MovableType+FCGI文章中的内容,成功让MT-Dispatch运行起来了。下面是我的Apache配置文件中同MT-Dispatch对应的部分,也可以作为如何配制fcgid的例子:

<IfModule fcgid_module>
   DefaultInitEnv MT_HOME /srv/www/sites/mindward/mt/
   DefaultInitEnv MT_PERIODIC 50
   DefaultInitEnv PERL_FCGI_MAX_REQUESTS 250
   DefaultInitEnv PERL_FCGI_CHILDREN 4
   DefaultInitEnv PERL_FCGI_LOG /var/log/httpd/fcgid.log

   Include /etc/httpd/inc.d/fcgid.inc
   <Directory "/srv/www/sites/mindward/mt">
     AddHandler fcgid-script .cgi
     <FilesMatch "^mt-(add-notify|atom|check|config|feed|testbg|upgrade|wizard|xmlrpc)\.cgi$">
        SetHandler cgi-script
     </FilesMatch>
     DirectoryIndex mt.cgi
     Options Indexes ExecCGI -MultiViews
     Order allow,deny
     Allow from all
     <FilesMatch "^mt(-cp|-search|-ftsearch|-comments|-tb)?\.cgi$">
        FCGIWrapper /srv/www/sites/mindward/mt/bin/mt-dispatch.fcgi .cgi
     </FilesMatch>
   </Directory>
 </IfModule>

其中,fcgid.inc的内容如下:

  SocketPath /var/lib/fcgid/fcgidsock
  SharememPath /var/lib/fcgid/fcgidshm
  BusyTimeout 300
  IdleTimeout 600
  IdleScanInterval 240
  BusyScanInterval 120
  ErrorScanInterval 6
  ZombieScanInterval 3
  ProcessLifeTime 1200
  SpawnScoreUpLimit 10
  SpawnScore 1
  TerminationScore 2
  MaxProcessCount 250
  DefaultMaxClassProcessCount 10
  DefaultMinClassProcessCount 0
  IPCConnectTimeout 20
  IPCCommTimeout 600
  MaxRequestsPerProcess 500

经过测试,Blog, Motion和Forum都能够正常工作。执行:

ps fax

能够看到启动了perl-fcgi进程。

需要注意的是,只有mt.cgi, mt-cp.cgi, mt-search.cgi这几个文件同fcgid环境是兼容的,其他文件还需要保持在cgi模式下运行,否则会出错。

总结

fcgid存在的这些陷阱,让我花费了不少时间去定位和排除,也许,好的软件应该注意做好防错设计,健壮的软件应该在容易并可能出现错误的时候,尽量能够给出有意义的提示信息,这样才是对软件用户友好的高质量软件。

技术总在不断的进步,apache已经有一个新的mod_proxy_fcgi模块在开发中,可能会从Apache2.4版本开始正式的内置对fastcgi协议的支持,从而不在需要安装第三方模块。另一方面,perl社群设计出了mod_perlite,期望让用perl编写的cgi能够象php那样容易部署和运行,但是该项目的成熟还需要时间。

不过,国人能写出在服务端广泛部署并使用的高性能软件,还是值得钦佩的。瑕不掩瑜,综合评估上面提到的技术方案,fcgid对于在apache2下面部署cgi应用程序,到目前为止,还是最佳选择。

更新:重新调整了fcgid.inc中的参数,调低了ProcessLifeTime的值, 并对应调整了其他参数。经过实际测试,新配制对提高系统稳定性有帮助。

No TrackBacks

TrackBack URL: http://www.mindward.com/mt/mt-tb.cgi/322

Leave a comment

最新日记

Slackware 13.0 Released
经过漫长的等待, 终于迎来了Slackw…
Enterprise Architecture 企业架构:融合企业架构,业务架构和知识管理提升企业绩效的实践方法
上次应福田科技局软件平台的邀请,做了一…
Emacs Column Editing by cua-mode
用Emacs很久了,可是,不断探索和学习…

最新动态

搞笑视频
强大 …
躺在冰面上笑
缺一棵大牙 …
小雨弹钢琴
成功 …

最新论坛主题

AIX重新弄好了
原来就是死机了,显示"110000AC"…
好像没看到我刚才发的
好像没看到我刚才发的 再来一个…
仅做测试
测试…