我在Debian Squeeze上使用nginx + php-fpm来pipe理一个繁忙的服务器,并且处理最大的连接时遇到了很大的困难。 这里的问题是,PHP进程有时只是在高负载下随机死亡,离开服务器没有PHP进程。 然后,我需要手动重新启动php5-fpm服务,使服务器恢复生机。
我想知道如何避免这种情况发生,或者至less通过自动重新启动php5-fpm来处理症状,只要没有php进程来监听传入的请求。 我的相关configuration是:
pm = dynamic pm.max_children = 1400 pm.start_servers = 10 pm.max_spare_servers = 20 pm.process_idle_timeout = 1s; #not sure it will be useful when pm=dynamic pm.max_requests = 100000 request_terminate_timeout = 30
我感谢你的build议,以应付这个讨厌的问题。
老看门狗脚本的想法吧? 不是解决你的问题的最优雅的方法,但它可以暂时补救的情况,直到你可以找出为什么发生在第一位。
实际的问题需要解决,要么服务器需要更加精细的调整,要么服务器function不足以处理负载。
你已经确定这个过程实际上是死的。 在这种情况下,就像确定过程是否仍然存在一样简单。 ps aux应该为你做。
例如:
ps aux|grep php-fpm|grep -v grep|awk '{print $2}'
应该输出php-fpm的进程ID。 如果不存在,则需要重新启动
所以沿着这个线应该做的伎俩。 (简单而简单)
#!/bin/bash pid=`ps aux|grep php-fpm|grep -v grep|awk '{print $2}'` if [ $pid == '' ] then service php-fpm restart fi
该脚本将作为一个crontab每分钟运行。 并没有被debugging。 所以试验一下,确保它正在工作。
与僵尸进程这样做的问题是他们实际上存在,并“运行”,但没有任何物理上做任何事情。 在这种情况下,他们将需要首先被杀害,然后重新启动进程。
同样,正确的做法是确定实际导致服务崩溃的原因。 看门狗脚本的想法是只为你买时间。
希望能帮助到你。 祝你好运
php-fcgi的问题是:在每个请求后进程保持活跃(不像php-cgi)。 每个请求都会增加php进程的内存使用量。 在任何时候进程达到php的内存限制。
你可以通过减less来避免这一点
pm.max_requests = <value>
pm.max_children = 1400
你不想要设置最高的儿童参数。 这实际上太高了。
您可能想要尝试一下,但是,老实说:
从…开始:
pm.max_children = 50
看看它是怎么回事