如何在nginx / php-fpm环境中正确分叉?

时间:2013-12-10 21:25:08

标签: nginx fork php

我有一个在我的机器上运行的非常简单的php套接字服务器。我使用“重启”和“停止”等简单方法创建了一个方便类,以便在服务器运行后对其进行控制。

重启函数的作用是向服务器发送停止命令,然后在父进程返回调用方时,它会分叉进程并在子进程内启动套接字服务器的新实例。

这在命令行上运行良好,但是我正在尝试创建一个重新启动套接字服务器的管理网页,并且分叉导致php-fpm出现问题。基本上,它看起来正在发生的是,当父进程结束并且nginx / php-fpm在分叉进程也结束之前没有将进程重新分配给新连接时,“页面加载”的生命不会结束。

在我的情况下,我不希望分叉的进程永远结束,最终我得到一个完全虚弱的服务器。 (在我的测试环境中,为简单起见,我将工作池设置为仅1,在生产环境中这将更高,但是这个问题会导致一个工作槽被永久占用)。

我尝试了一些事情,包括在分叉之前调用fastcgi_finish_request(),但这没有任何影响。

如何在不锁定nginx连接池中的赋值的情况下从php-fpm工作进程重启我的服务?

2 个答案:

答案 0 :(得分:0)

听起来你的协议设计有误。服务器应该是重启自己的能力。有很多例子说明如何在互联网上做到这一点。 客户(您的网页)不需要进行任何分叉。 服务器也不应该在php-fpm中运行,而应该是一个控制台应用程序,它使用守护进程(3)类型的接口将自己从控制台中分离出来。

答案 1 :(得分:0)

解决方案简单而基本。

我的子进程没有将STDOUT和STDERR重定向到/ dev / null,因此即使父进程完成,子进程仍然有活动文件描述符这一事实导致php-fpm将其连接视为其池中的连接仍处于活动状态,因此永远不会在子进程不断运行的基础上重新分配给新连接。

将STDERR和STDOUT重定向到/ dev / null导致php-fpm正确地重新分配连接,同时允许子进程(套接字服务器)永远运行。案件结案。

./some/command >/dev/null 2>&1

应该看到这一个离开一英里......

(几个月前我解决了这个问题,但很长一段时间没有登录这个帐户......我花了7个月的时间才弄清楚我需要将输出直接输出到/ dev /空!)