前言
升级到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的值, 并对应调整了其他参数。经过实际测试,新配制对提高系统稳定性有帮助。
Leave a comment