我在 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
感谢您提出的解决这个棘手问题的建议。
老看门狗脚本的想法是吧?这不是解决问题的最优雅的方法,但它可以暂时补救这种情况,直到您首先弄清楚为什么会发生这种情况。
实际问题需要解决,要么是服务器需要更精细地调整,要么是服务器功能不够强大,无法首先处理负载。
您已确定该进程实际上已经结束。在这种情况下,就像确定进程是否仍然存在一样简单。ps aux 应该为你做。
例如:
应该输出 php-fpm 的进程 ID。如果不存在则需要重新启动
所以类似的东西应该可以解决问题。(简短而简单)
该脚本将作为 crontab 每分钟运行一次。并且尚未调试。因此,请对其进行试验并确保其正常工作。
使用僵尸进程这样做的问题是它们确实存在并且正在“运行”但实际上没有做任何事情。在这种情况下,他们需要先被杀死,然后进程重新启动。
同样,正确的做法是确定真正导致服务崩溃的原因。看门狗脚本的想法只是为了给你争取时间。
希望能帮助到你。祝你好运
php-fcgi 的问题是:进程在每次请求后保持活动状态(与 php-cgi 不同)。每个请求都会增加php进程的内存使用。任何时候进程达到 php.ini 的内存限制。
你可以通过减少来避免这种情况
您不会不想将 max children 参数设置得那么高。这实际上太高了。
您可能想尝试一下,但是老实说:
从...开始:
看看进展如何。