我们可以重新加载其中一个PHP-FPM池而不会打扰其他人

kay*_*aks 33 php

我为同一主机提供了多个PHP-FPM UNIX套接字池,以便对代码库/功能进行逻辑分离,并解决相同的未来扩展问题.Nginx根据URI模式管理到正确套接字的路由.部署工作正常.

每当我更改任何一个池配置时,我正在重新加载/重新启动FPM进程(通过USR2信号).

我不知道FPM的内部是如何工作的,但我认为当我重新启动主进程时,所有池都会重新启动/重新加载.如果我错了,请纠正我.

我想知道当其他人按原样工作时是否可以重新加载/重新启动一个池(这些池中正在进行的事务中没有问题).

我还要感谢任何其他配置建议,这些建议可以让我拥有所需的池管理

reg*_*ero 42

php-fpm允许正常重启子进程,通常使用reload关键字而不是restartinit脚本,发送USR2信号.

因此,通过正常重启,您不应该丢失任何正在运行的事务.在每个人的当前请求管理结束后,孩子们被杀死.如果您不需要真正的重启,这应该足够了.我做了一些测试,例如重新加载足以:

  • 清空APC缓存
  • 更改日志文件路径
  • 改变最小/最大/开始子设置

所以我没有找到需要真正重启的情况.除了重新加载无法启动已停止的服务.

如果要确保在要重新加载其中一个池时永远不会重新加载其他池,则必须管理多个php-fpm守护程序和每个守护程序一个池.这意味着要编写几个init脚本和主配置文件.

使用restart关键字更危险,尤其是因为init脚本可能会在停止步骤中杀死长时间运行的子节点.并且有几个守护进程使用多个PID和配置文件进行管理,你甚至可以获得start-stop-daemon带有--exec选项的命令(在debian中就是这种情况),这会杀死所有运行相同php-fpm可执行文件的守护进程(有效地向所有人发送kill -9)如果你运行几个php-fpm进程,那么在使用正确的PID停止正确的PID之后的其他并行php-fpm守护进程,这是非常糟糕的).

因此必须使用reload关键字(USR2信号).

  • 一定要将`process_control_timeout`设置为0以外的其他值才能生效.将`process_control_timeout = 60s`添加到我的配置后.我能够让这个工作. (7认同)

小智 7

尽管已经有最佳答案,但我写信是为了提供最佳答案中遗漏的更多信息。

  • 执行 reload 后,PHP-FPM 将等待所有请求处理完毕但不超过 process_control_timeout。如果达到process_control_timeout,会出现502错误
  • 在等待处理完所有请求时,PHP-FPM不会处理任何新请求,而是将它们排入队列。因为只有在处理完所有旧请求后才会创建新的重载进程。

这导致了一些事实和问题:

  • 当谈到零停机时间时,延迟处理算不算?
  • 服务器可以排队多少个请求?
  • 当然,延迟处理意味着页面会卡在用户端。