Apache and PHP FastCGI

虽然Nginx加上php有相当优秀的表现,但是有时候,基于业务需要,不得不用ApachephpApache下有两种运行方式,一种是编译成Apache的模块,一种是以cgi方式运行,cgi则可细分为fastcgi,以模块方式运行,无论Apache还是php出现安全漏洞,需要升级软件版本,都需要同时重新编译二者,这是一个很没有统筹科学的态度,以普通cgi方式运行,配置简单,但比之于fastcgi效率不高,每个脚本执行都需要reload script和php.ini,基本上,这个意思就是说,脚本缓存是无效的,所以,我们需要fastcgi。

需要说明的是,在当前php5.3.6版本中,php-fpm已经包含在源代码中,只需要在编译的时候加入相应参数: –enable-fpm,安装完成后,拷贝/src/php-5.3.6/sapi/fpm/init.d.php-fpm 到/usr/local/bin/,然后chmod +x 就可以了

Usage: /usr/local/bin/init.d.php-fpm {start|stop|force-quit|restart|reload}

当然,你知道配置文件默认放在/usr/local/etc/php-fpm.conf,修修改改就可以start了!

php的配置很简单,但Apache的mod_fastcgi是需要单独下载编译的:
1,下载mod_fastcgi:http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz
解压缩了来安装到Apache里面去,例如,我们把Apache安装在了/usr/local/httpd:

tar zxf mod_fastcgi-current.tar.gz
cd mod_fastcgi-2.4.6
cp Makefile.AP2 Makefile
make install top_dir=/usr/local/httpd

2,在配置文件中启用mod_fastcgi,例如我们可以包含一个配置文件在extra目录中,起个名字叫httpd-fastcgi.conf,这个例子呢,我是把php-fpm的socket放在/tmp目录下的:

LoadModule fastcgi_module modules/mod_fastcgi.so
ScriptAlias /php-bin /usr/local/bin
AddHandler application/x-httpd-php5 php
Action application/x-httpd-php5 /php-bin/php-cgi
FastCgiExternalServer /usr/local/bin/php-cgi -socket /tmp/php.sock

当然,基于安全考虑,可以将配置文件单独放在不同的虚拟主机中。

单点故障的可能

上次说到使用Memcached来存储session,这样就可以不用Tomcat的session同步机制(因为Y这么多年居然一点没变化过),直接做http的负载均衡,前端不管用硬件还是软件实现,系统结构都会显得更为简单,但是一直觉得,依然存在单点故障的可能,想想还是画个图比较清晰,画了几遍,如果除去Cache Cluster,那么木有单点故障的最小结构至少需要服务器十台,当然,我画的是理想化状态,Memcached的logo真TM恐怖……这样的结构,应该不会再有单点故障的可能,而且扩展起来也是很方便的,堆服务器就是了。

尝试了一把nginx和php-fastcgi

尝试了一把nginx和php-fastcgi,感觉速度好像是快了点,也许是错觉,不过以nginx四百多K的体积能做到这样我觉得相当不错,简要写一下配置。首先当然是安装nginx,不管你是编译还是二进制,这个没有太多可以说的,差不多,然后呢是编译php,在apache下面安装习惯了,一直没把–with-apxs去掉,我就说怎么一直不给生成那个php-cgi文件呢,搞了半天是不能同时使用的,靠,configure的时候又不提示一下,无效开关应该要提示才对的嘛,接下来是修改一下php.ini,修改说明如下:

; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP’s
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
; this to 1 will cause PHP CGI to fix it’s paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
cgi.fix_pathinfo=1

倒数第二步呢,当然就是启动php-cgi server,使用命令行启动:php-cgi -b 127.0.0.1:9000 使得其监听在本地9000端口,最后一步就是修改nginx配置了,MMP的配置文件里面居然还有语法,所以不流行撒,看apache的配置都形成了一个规范,配置文件是这样的,其它部分我跳过了,不用修改,只写下修改的虚拟主机部分,我们以bbs.hnair.com为例:

###############bbs.hnair.com######哈利路亚#########
server {
listen 80;
server_name bbs.hnair.com;
location / {
index index.html index.htm index.php;
root /usr/local/www/bbs.hnair.com;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/www/bbs.hnair.com/$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
}
}

当然了,一些细小的配置,例如gzip压缩,rewrite,用户验证等等,我再研究下了来,可是想了想,按照web应用的细分,这种结构是为了极大负载设计,那么就不应该有rewrite,用户验证这些东西,simple is the best~