nginx - 超时后不正常的工作人员终止
Posted
技术标签:
【中文标题】nginx - 超时后不正常的工作人员终止【英文标题】:nginx - ungraceful worker termination after timeout 【发布时间】:2015-09-10 08:29:07 【问题描述】:我打算使用 nginx 来代理 websockets。执行 nginx reload / HUP 时,我了解 nginx 等待旧的工作进程停止处理所有请求。然而,在 websocket 连接中,这可能不会发生很长时间,因为连接是持久的。是否有选项/路线图可以在重新加载超时后强制终止旧的工作进程?
参考文献:
http://nginx.org/en/docs/control.html
http://forum.nginx.org/read.php?21,247573,247651#msg-247651
谢谢
【问题讨论】:
【参考方案1】:除非您有任何解决方案:proxy_read_timeout 1d 或 ping 消息以保持连接处于活动状态,否则 Nginx 会在 60 秒内关闭连接。选择此默认值是有原因的。
看看Nginx核心开发者says:
有proxy_read_timeout (http://nginx.org/r/proxy_read_timeout) 这也适用于 WebSocket 连接。你必须撞它 如果您的后端长时间不发送任何内容。或者, 你可以配置你的后端发送 websocket ping 帧 定期重置超时(并检查连接是否 还活着)。
话虽如此,没有什么可以阻止您使用 USR2+QUIT 信号组合,通常在您优雅地在二进制升级时重新启动 Nginx 时使用。 Nginx master/worker 进程很少消耗超过 50MB 的内存,所以保持多个 master 并不是那么昂贵。 USR2 帮助 fork 新的 master 并产生它的 worker,然后优雅地关闭旧的 worker 和 master。
【讨论】:
如果确实有来自后端服务器的周期性 ping,则不会终止连接。但是,在您回答后再次阅读“控制 nginx”文档,我认为在将 HUP 发送到主 nginx 并等待几分钟后,我可以简单地将 TERM(快速关闭)发送给仍然活着的旧工作人员,以终止他们。 是的,准确地说,USR2 信号分叉了新的主服务器,开始为新客户端提供服务,然后如果由于打开的连接而无法正常关闭,则需要先退出到旧主服务器,然后再执行 INT 或 TERM 信号. 你为什么建议使用 USR2 而不是 HUP,它会在不产生新主人的情况下分叉新工人? @dux2 USR2 有助于将新主人及其工人与旧主人分开。并且还通过向老主人发送 TERM 信号一次性终止所有老工人。以上是关于nginx - 超时后不正常的工作人员终止的主要内容,如果未能解决你的问题,请参考以下文章