php-fcgi进程数超过预设值问题的解决

昨日,有朋友问我,他将Web服务器换成Nginx 0.6.31 + PHP 4.4.7(FastCGI)后,有时候访问会出现“502 Bad Gateway”错误,如何解决。

我让按照以下两个步骤去解决,最后在第2步中将FastCGI的timeout时间增加为300,问题解决:

PS:比较羡慕迅雷的Web服务器,16G内存。

1、查看当前的PHP FastCGI进程数是否够用:
netstat -anpo | grep “php-cgi” | wc -l

如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。

2、部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如:
……
http
{
……
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
……
}

 

==================================================

php-fpm 修改php-cgi进程数

vi /usr/local/php/etc/php-fpm.conf

修改这个里面的值
5

然后
/usr/local/php/sbin/php-fpm restart

==================================================
现象:
某日和开发的同事调试服务器php状态时候发现下面这种情况:
ps aux |grep php-fcgi |wc -l
602
表面上看是没什么问题,可是我明明记得 php-fcgi我只开了300个啊!难道有人改过了?
立 刻查看php-fpm.conf找到这一项
<value name=”max_children”>300</value>
确实是300个啊~~,怎么会有600个?
ps aux |grep php-fcgi |more
www      11707  0.0  0.7 250192  3888 ?        S    17:07
www      11708  0.0  0.7 250192  3888 ?        S    17:07
www      11709  0.0  0.7 250192  3888 ?        S    17:07
www      11710  0.0  0.7 250192  3888 ?        S    17:07
www      11711  0.0  0.7 250192  3888 ?        S    17:07
状态都正常啊,奇怪了。尝试把 php-fcgi重启一下
/usr/local/php-fcgi/sbin/php-fpm restart
Shutting down php_fpm . done
Starting php_fpm  done

再次查看
ps aux |grep php-fcgi |wc -l
602

还 是多了300个…..奇怪了,这三百个是怎么来的呢?
因为我们的php和nginx是 一起的,所以我又想到了nginx。
在访问量不高的时候偷偷重启了一下nginx
/etc/init.d/nginx restart
停止 nginx:                                               [确定]
Shutting down php_fpm  done
启动 nginx:                                               [确定]
Starting php_fpm  done

再次查看,我倒…..真服了。我和开发的同事都一头雾水
ps aux |grep php-fcgi |wc -l
602
这回不能简单的考虑重启服务了,需要想想到底是哪里 出的问题,而且这是生产服务器不能随便弄。
因为现在线上的服务都还算正常,这个问题我们就先放下了。
第二天,那个同事跟我说。那个问题他知道怎么解决了,而 且也知道是什么原因造成的。我赶紧问清楚:
原来是这样,最近因为测试比较频繁,对nginx服务重启次数较多。不知道哪次重启时候失败导致nginx进程虽然停止了,
但是一起的300个php-fcgi却没有重启,导致这些进程还留在内存里不能被释放。需要强制手动杀掉所有的php- fcgi进程后再重启php-fpm就可以了。
听到这里我恍然大悟。马上去服务器上操作,果然问题解决了,具体步骤如下
pkill php-cgi
再次查看
ps aux |grep php-fcgi |wc -l
1
好了没有了,赶紧重启,因为现在访问网页已经是 502了。
/usr/local/php-fcgi/sbin/php-fpm restart
Shutting down php_fpm warning, no pid file found – php-fpm is not running ?
Starting php_fpm  done
再次查看进 程数
ps aux |grep php-cgi |wc -l
302
好了,正常 了,呵呵
后来我在试验机上面又测试了一下,果然重现了那个问题

[root@ime /]# /etc/init.d/nginx restart
停止 nginx:                                               [确定]
Shutting down php_fpm  done
启动 nginx:                                               [确定]
Starting php_fpm  done
[root@ime /]# ps aux |grep php-cgi|wc -l
302
这时进程数是正常的,下面杀掉nginx 进程
[root@ime /]# pkill nginx
[root@ime /]# lsof -i:80
[root@ime /]# ps aux |grep php-cgi|wc -l
302
这300个进程就傻乎乎的留在这里了,再 次启动nginx
[root@ime /]# /etc/init.d/nginx start
启动 nginx:                                               [确定]
Starting php_fpm  done
[root@ime /]# lsof -i:80
COMMAND   PID USER   FD   TYPE DEVICE SIZE NODE NAME
nginx   14072 root    8u  IPv4  64090       TCP *:http (LISTEN)
nginx   14073  www    8u  IPv4  64090       TCP *:http (LISTEN)

[root@ime /]# ps aux |grep php-cgi|wc -l
603
php-fcgi没有去理会在内存中存在的进程,继续开启了300个…
我如果再重复这个过程呢?
[root@ime /]# pkill nginx
[root@ime /]# lsof -i:80
[root@ime /]# /etc/init.d/nginx start
启动 nginx:                                               [确定]
Starting php_fpm  done
[root@ime /]# pkill nginx
[root@ime /]# lsof -i:80
[root@ime /]# ps aux |grep php-cgi|wc -l
904
900个… 继续重复
[root@ime /]# /etc/init.d/nginx start
启动 nginx:                                               [确定]
Starting php_fpm  done
[root@ime /]# ps aux |grep php-cgi|wc -l
954
[root@ime /]# ps aux |grep php-cgi|wc -l
1205
机 器开始变慢了,估计再重复几次机器就会挂掉了…
[root@ime /]# pkill php-cgi
[root@ime /]# ps aux |grep php-cgi|wc -l
5
[root@ime /]# ps aux |grep php-cgi|wc -l
5
[root@ime /]# ps aux |grep php-cgi|wc -l
1
[root@ime /]# /etc/init.d/nginx restart
停止 nginx:                                               [确定]
Shutting down php_fpm warning, no pid file found – php-fpm is not running ?
启动 nginx:                                               [确定]
Starting php_fpm  done
[root@ime /]# ps aux |grep php-cgi|wc -l
302
好了,恢复正常….
看来需要修改一下 php-fpm的启动脚本了

=====================================================================

1、查看当前的PHP FastCGI进程数是否够用:
netstat -anpo | grep “php-cgi” | wc -l

如果实际使用的 “FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。
2、部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如:
……
http
{
……
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
……
}
……

评论关闭