我在 Nginx 和 PHP-FPM(PHP 版本 8.1)上设置了一个 Web 服务器。它已经运行了一年多,运行良好。最近,我注意到该网站会停机几个小时 - 可能每周一两次。经过调查,我发现如果我手动重新启动 php-fpm sudo systemctl restart php8.1-fpm
,一切都会重新开始工作。我怀疑这可能是 DDoS 攻击激增,因为有人一直在骚扰我们的网站。它也是一个流量较大的网站。
我们设置了多个站点/池。这些站点继续正常工作。只有这个站点的 php-fpm 似乎冻结了并且不再工作,也不会自动重新启动。
以下是网站出现故障期间我的 php8.1-fpm.log 的部分内容:
[03-Aug-2023 22:49:30] NOTICE: [pool mysite] child 3543342 exited with code 0 after 62.878657 seconds from start
[03-Aug-2023 22:49:30] NOTICE: [pool mysite] child 3545476 started
[03-Aug-2023 22:49:33] WARNING: [pool mysite] server reached max_children setting (300), consider raising it
[03-Aug-2023 22:49:35] NOTICE: [pool mysite] child 3543761 exited with code 0 after 57.142360 seconds from start
[03-Aug-2023 22:49:35] NOTICE: [pool mysite] child 3545610 started
以下是该网站的配置:
[mysite]
user = mysite
group = mysite
listen = /run/php/php8.1-fpm-mysite.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = ondemand
pm.max_children = 300
pm.process_idle_timeout = 10s
pm.max_requests = 20
几周前,我将以下内容添加到主 php-fpm.conf 文件中,试图在发生这种情况时自动重新启动 php-fpm,但这似乎不是解决方案:
emergency_restart_threshold=3
emergency_restart_interval=1m
process_control_timeout=5s
我不确定到底是什么原因导致的,或者为什么它只对一个网站停止响应。但是,我想知道一个自动化的解决方案或一些配置,以便 php-fpm 在发生这种情况时自行重新启动。