如何自动恢复php-fpm?

如何自动恢复php-fpm?

我在 Debian Squeeze 上为一个繁忙的服务器使用 nginx+php-fpm,在处理达到最大连接数的问题时遇到了很大困难。这里的问题是,php 进程有时会在高负载下随机死亡,导致服务器没有 php 进程。然后我需要手动重启 php5-fpm 服务才能让服务器恢复运行。

我想知道如何避免这种情况发生,或者至少通过在没有 php 进程监听传入请求时自动重新启动 php5-fpm 来治疗症状。 我的相关配置是:

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

我很感激您为解决这一棘手问题提出的建议。

答案1

旧的看门狗脚本想法,嗯?这不是解决问题的最优雅的方法,但它可以暂时补救这种情况,直到你能弄清楚为什么会发生这种情况。

需要解决的实际问题是,要么服务器需要进行更精细的调整,要么服务器本身就不够强大,无法处理负载。

您已确定该进程确实已终止。在这种情况下,只需确定该进程是否仍然存在即可。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 运行。并且尚未调试。因此,请对其进行试验并确保其正常运行。

对僵尸进程执行此操作的问题在于它们实际上存在并且正在“运行”,但实际上并没有执行任何操作。在这种情况下,需要先终止它们,然后重新启动进程。

再次强调,正确的做法是确定导致服务崩溃的真正原因。监视脚本的理念只是为了为您争取时间。

希望有帮助。祝你好运

答案2

php-fcgi 的问题是:进程在每次请求后都会保持活动状态(与 php-cgi 不同)。每次请求都会增加 php 进程的内存使用量。任何时候进程都会达到 php 的内存限制。

您可以通过减少来避免这种情况

pm.max_requests = <value>

答案3

下午.max_children = 1400

您不会想将最大子代参数设置得那么高。这实际上太高了。

你可能想尝试一下,但是老实说:

从...开始:

下午.max_children = 50

看看进展如何。

相关内容