我目前正在设置一个 VPS(使用 VPS.NET),我将用它来托管博客和其他一些东西。我已经安装了 nginx,并使用 php-fpm 修补了 php(5.2.8)。
一切都运行良好(而且速度极快!),除了一个恼人的问题:因为该网站目前没有其他流量,所以在空闲一段时间后,所有 php-cgi 进程都死机了。当我尝试访问该网站时,nginx 返回一个不错的“502 bad gateway”,为了修复它,我必须手动重新启动 php-fpm 以使网站再次运行。这是为什么?我发现这是一个常见问题,但在我利用业余时间寻找解决方案几天后,我还是没有找到适合我的解决方案。
有什么建议吗?提前致谢
答案1
我正在运行一个非常相似的设置(nginx 0.7.61,php+fpm 5.2.10),并且我的 PHP 进程永远不会死,即使在空闲之后。
我的php-fpm.conf的进程控制位如下:
<value name="pm">
<value name="style">static</value>
<value name="max_children">3</value>
<value name="apache_like">
<value name="StartServers">20</value>
<value name="MinSpareServers">5</value>
<value name="MaxSpareServers">35</value>
</value>
</value>
<value name="request_terminate_timeout">0s</value>
<value name="request_slowlog_timeout">0s</value>
<value name="slowlog">logs/slow.log</value>
<value name="rlimit_files">1024</value>
<value name="rlimit_core">0</value>
<value name="chroot"></value>
<value name="chdir"></value>
<value name="catch_workers_output">yes</value>
<value name="max_requests">500</value>
请注意,虽然我已经定义了类似 apache 的位(它们是默认配置的一部分),但由于我有 PM 样式静态设置,因此它们不会被使用。
您可以使用全局选项部分中的以下选项将日志提升到调试级别:
<value name="log_level">debug</value>
看看是否有报告显示其关闭工人的原因。
如果这不起作用,那么一个临时解决办法就是使用像 pingdom 这样的服务每 x 分钟在你的网站上访问一次 php,但是我对这个软件组合的经验并不表明这是必需的。
答案2
不确定 PHP-FPM 与 fastcgi 模式下的标准 PHP 有何不同,但通常情况下,每个 PHP 进程在终止之前只会处理有限数量的请求。这可以防止内存泄漏随着时间的推移而累积。这非常有效,除非您只有一个 PHP 进程,在这种情况下它会一直运行,直到完成其请求配额然后退出。您应该查看您是否正在运行单个进程或是否有多个进程。如果有多个,请忽略这一点。如果只有一个,则需要确保在启动 PHP 之前导出 PHP_FCGI_CHILDREN 环境变量。PHP_FCGI_MAX_REQUESTS 控制每个单独进程将运行的请求数。