我要解释的实际上是有关 nginx 进程的内容,因此也许可以在 nginx 中完成,或者这可能是 Linux 的功能。无论如何,我希望这是可能的。
我正在ningx
运行一个进程,如下所示:
root 19568 ..... nginx: master (old)
app 20769 ..... nginx: worker (old)
然后我USR2
向主进程发送一个信号:kill -USR2 19568
这给了我一个新的master
过程worker
:
root 19568 ..... nginx: master (old)
app 20769 ..... nginx: worker (old)
root 22716 ..... nginx: master (new)
app 22717 ..... nginx: worker (new)
因此,目前,old
进程正在处理所有数据。我可以告诉nginx
Ubuntu 将这些任务交换到新进程吗?
我为什么需要这个?
我知道nginx
有一个reload
命令可以动态重新加载其配置。它甚至可以在不停机的情况下更新自己的可执行文件。
但是我的 nginx 服务器使用TCP
模块,因此它不断接收数据。因此我无法使用reload
或HUP
命令,因为工作进程一直很忙。它们无法关闭。
重新启动 nginx 会使我丢失所有客户端连接,而我真的不想这样。
这就是为什么我正在寻找一种方法将某个流程的任务转移到该流程的新实例。
答案1
Nginx
取决于工作进程能否正常关闭。显然,它可以使用新应用的配置启动新请求。但它不会继续已启动的请求。
引自http://nginx.org/en/docs/beginners_guide.html:
一旦主进程收到重新加载配置的信号,它就会检查新配置文件的语法有效性并尝试应用其中提供的配置。如果成功,主进程将启动新的工作进程并向旧工作进程发送消息,要求它们关闭。否则,主进程将回滚更改并继续使用旧配置。旧工作进程收到关闭命令后,将停止接受新连接并继续为当前请求提供服务,直到所有此类请求都得到服务。此后,旧工作进程将退出。
虽然显然有一种方法可以将套接字传输到 Linux 中的另一个进程 - 请参阅https://stackoverflow.com/questions/1997622/can-i-open-a-socket-and-pass-it-to-another-process-in-linux- 它仍然不太可能nginx
仅仅“接受这一点”并开始应用其给定的(新)配置。
如果这个问题的根本目标是将更改应用于正在运行的服务,而不会在将来丢失客户端连接,那么您可能不得不问另一个问题。
这个问题可能与实现一些暂停逻辑有关。例如,当被要求正常关闭时保存状态并恢复状态(例如与某个会话或请求相关的状态)。