43

I've multiple PHP-FPM UNIX socket pools for the same host to have logical separation of codebase / functionality & to address future scaling of the same. Nginx manages the routing to the right socket based on URI patterns. Deployment is working fine.

Whenever I change pool configuration for any one, I am reloading / restarting the FPM process (by USR2 signal).

I don't have any idea about how the internals of FPM work but I assume that as I restart the main process, all pools get restarted / reloaded. Please correct me if I'm wrong.

I want to know if I could reload / restart only one pool when others work as they were (no issues in the undergoing transactions on those pools).

I would also appreciate any other configuration suggestions which could allow me to have desired pool management

4

2 回答 2

55

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

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

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

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

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

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

所以使用 reload 关键字(USR2 信号)是必须的。

于 2013-06-03T09:53:13.977 回答
7

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

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

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

  • 当谈到零停机时间时,延迟处理是否算数?
  • 服务器可以排队多少个请求?
  • 当然,延迟处理意味着页面会卡在用户端。
于 2020-11-16T10:28:40.823 回答