故障:apache2.4 web服务器下,加载fastcgi 模块,始终无法加载
分析:1,查找文档过程中发现,apache 还有另外一个功能相近的模块,mod_fcgid,很多人说,fcgid要比fastcgi兼容性要好,因为mod_fastcgi是fastCGI.com的项目,遵循FastCGI授权条款。mod_fcgid是Apache基金会负责的项目,使用的是Apache-2.0授权条款。因此,不仅主要负责单位不同,其授权方式也不同
2,mod_fastcgi的授权不是标准的自由/开放源码授权条款,所以显得与其他授权条款格格不入,再加上Linux distribution套件管理政策的因素,使得mod_fastcgi难以全面进入所有Distribution官方库。网上会发现说mod_fastcgi几乎没有再继续开发了,因此也使得网路上许多人转而推荐mod_fcgid。其实这是最大的误解。官方说法是,FastCGI protocol 是一个轻量级且成熟的通讯协定,所以不太需要再额外加上新功能,而目前的工作主要在于瑕疵修复,也就几乎没有任何开发进展。
3,虽然mod_fastcgi与mod_fcgid都支援FastCGI protocol,但设计的概念不同。mod_fcgid的理念是快速的结束FastCGI server并再快速的产生一个。这个方法与FastCGI protocol初衷不同,FastCGI protocol是希望能够允许long-running request。以PHP 应用为例,为了加速PHP 效能,通常会使用bytecode/opcode cache,例如APC、eAccelerator 或Xcache 等。但为了共享cache,意谓着process/request 必须在同一个shared cache中,而无法跨不同的FastCGI or FCGI process。因此在设计上,只能允许一个PHP process启动,然后由此spawn多个children process,使得children 能够享用parent的bytecode/opcode。
4,mod_fcgid的官方描述是:
mod_fcgid is a high performance alternative to mod_cgi or mod_cgid, which starts a sufficient number instances of the CGI program to handle concurrent requests, and these programs remain running to handle further incoming requests. It is favored by the PHP developers, for example, as a preferred alternative to running mod_php in-process, delivering very similar performance. 5,所以用哪个模块都无所谓
处理过程:
1,根据配置正常在apache 配置文件里conf-enable里配置php5-fpm 但发现始终无法加载,
2,分析过后,发现cgi方式和mod_php方式的不同在于,mod_php是将访问的PHP文件当作可执行文件来运行,所以它直接运行任何文件,也即可以有多个入口,而fastcgi则不同,它只地将请求发给一个入口php文件,由这个文件进行转发。所以怀疑,mod_php5 模块在apache2.4环境下与mod_fastcgi相互冲突,故a2dismod php5 关闭这个模块,fastcgi 便能正常加载了
504故障:
按照网上的很多文章搜一下就故障发生的原理了,是犹豫后端php处理时间过长,后端应用服务器还没返回给前段服务器,这是前段服务器已经超时,所以前段服务器已经把超时结果返回给了客户端,但实际上,后端还在正常无力php程序,,解决办法很简单,就是在php-fpm.conf 把
request_terminate_timeout = 10 时间设置的比前段服务器超时时间小就可以了,这样后端服务器如果处理不完,php-fpm 就会重新终止php-fastcgi 重新开启一个新的进程,同时并返回给前段,重新处理请求,这样便不会出现504错误,
关于两种加载fastcgi模块的方法:
1,第一种,不适用mod_fastcgi 模块, 继续使用mod_php5,但需要额外的模块就是mod_proxy代理,这样所有的php请求都已url 的形式请求过来,在通过一些正则规则,转发到后端的php-fpm server上,这样的话,有一定问题,就是开发如果把php文件类型隐藏掉,那么正则就会变得异常难写
2,第二种,就是直接安装mod_fastcgi模块,并在conf-enable/php5-fpm.conf 加载到apache里,然后使之转发到后端的php-fpm服务器上,理由详见上文写的“处理过程”
最后贴下配置:
系统是Ubuntu14.04
apache2/conf-enable/php5-fpm.conf
<IfModule mod_fastcgi.c> AddHandler php5-fcgi .php Action php5-fcgi /php5-fcgi Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi # FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization -idle-timeout 60 -flush </IfModule>
修改配置文件 并指向后端php5-fpm 服务器
同时启用a2enmod fastcgi模块 默认配置就好
最后从phpinfo里看到server API 是FPM/FASTCGI
这里的配置要说明一下:
fascgi的超时时间要大于max_execution_time(php执行时间) 和request_terminate_timeout(cgi子进程处理请求时间),
如果三者超时时间关系搞错,服务器会报500错误
PS:最后吐槽一下apache web服务器,这配置文件简直乱的一逼,目录切来切去的,本来很简单的一个504错误引发出这么问题,苦战4天也算是有收获