nginx信号集实例分析(nginx详细讲解)

nginx信号集实例分析(nginx详细讲解)

浏览次数:
信息来源: 用户投稿
更新日期: 2026-07-19
文章简介

吸收了这个教训之后,我们需要更加合理地关闭我们的nginx服务。所以一个更加合理的nginx服务启动关闭脚本是必需的,网上流传的一些脚本并没有对这个现象做处理,我们更应该参考nginx官方提供的

2025阿里云双十一服务器活动

吸收了这个教训之后,我们需要更加合理地关闭我们的nginx服务。所以一个更加合理的nginx服务启动关闭脚本是必需的,网上流传的一些脚本并没有对这个现象做处理,我们更应该参考nginx官方提供的脚本。

这段代码引自nginx官方的/etc/init.d/nginx。

接下来我们来全面梳理下nginx信号集,这里不会涉及到源码细节,感兴趣的同学可以自行阅读相关源码。

我们有两种方式来向master进程发送信号,一种是通过nginx-ssignal来操作,另一种是通过kill命令手动发送。

第一种方式的原理是,产生一个新进程,该进程通过nginx.pid文件得到master进程的pid,然后把对应的信号发送到master,之后退出,这种进程被称为signaller。

第二种方式要求我们了解nginx-ssignal到真实信号的映射。下表是它们的映射关系:

operationsignalreloadsighupreopensigusr1stopsigtermquitsigquithotupdatesigusr2&sigwinch&sigquitstopvsquit

stop发送sigterm信号,表示要求强制退出,quit发送sigquit,表示优雅地退出。具体区别在于,worker进程在收到sigquit消息(注意不是直接发送信号,所以这里用消息替代)后,会关闭监听的套接字,关闭当前空闲的连接(可以被抢占的连接),然后提前处理所有的定时器事件,最后退出。没有特殊情况,都应该使用quit而不是stop。

master进程收到sighup后,会重新进行配置文件解析、共享内存申请,等一系列其他的工作,然后产生一批新的worker进程,最后向旧的worker进程发送sigquit对应的消息,最终无缝实现了重启操作。

nginx信号集实例分析,nginx详细讲解

这里sleep1是必须的,因为在master进程向worker进程发送sigusr1消息到worker进程真正重新打开access.log之间,有一段时间窗口,此时worker进程还是向文件access.log.0里写入日志的。通过sleep1s,保证了access.log.0日志信息的完整性(如果没有sleep而直接进行压缩,很有可能出现日志丢失的情况)。

某些时候我们需要进行二进制热更新,nginx在设计的时候就包含了这种功能,不过无法通过nginx提供的命令行完成,我们需要手动发送信号。

通过上面的问题复现,大家应该已经了解到如何进行热更新了,我们首先需要给当前的master进程发送sigusr2,之后master会重命名nginx.pid到nginx.pid.oldbin,然后fork一个新的进程,新进程会通过execve这个系统调用,使用新的nginxelf文件替换当前的进程映像,成为新的master进程。新master进程起来之后,就会进行配置文件解析等操作,然后fork出新的worker进程开始工作。

接着我们向旧的master发送sigwinch信号,然后旧的master进程则会向它的worker进程发送sigquit信息,从而使得worker进程退出。向master进程发送sigwinch和sigquit都会使得worker进程退出,但是前者不会使得master进程也退出。

如果我们觉得旧的master进程使命完成,就可以向它发送sigquit信号,让其退出了。

worker进程如何处理来自master的信号消息

实际上,master进程再向worker进程通讯,不是使用kill函数,而是使用了通过管道实现的nginxchannel,master进程向管道一端写入信息(比如信号信息),worker进程则从另外一端收取信息,nginxchannel事件,在worker进程刚刚起来的时候,就被加入事件调度器中(比如epoll,kqueue),所以当有数据从master发来时,即可被事件调度器通知到。

nginx这么设计是有理由的,作为一个优秀的反向代理服务器,nginx追求的就是极致的高性能,而signalhandler会中断worker进程的运行,使得所有的事件都被暂停一个时间窗口,这对性能是有一定损失的。

很多人可能会认为当master进程向worker进程发送信息之后,worker进程立刻会有对应操作回应,然而worker进程是非常繁忙的,它不断地处理着网络事件和定时器事件,当调用nginxchannel事件的handler之后,nginx仅仅只是处理了一些标志位。真正执行这些动作是在一轮事件调度完成之后。所以这之间存在一个时间窗口,尤其是业务复杂且流量巨大的时候,这个窗口就有可能被放大,这也就是为什么nginx官方提供的日志切割方案里要求sleep1s的原因。

当然,我们也可以绕过master进程,直接向worker进程发送信号,worker可以处理的信号有

signaleffectsigint强制退出sigterm强制退出sigquit优雅退出sigusr1重新打开文件

以上就是nginx信号集实例分析的详细内容,更多请关注主机测评网其它相关文章!

标签:
提高互联网速度的十大最佳公共DNS(能提高网速的dns)
« 上一篇
陕西网站制作如何选择好的服务商(陕西网站建设制作)
下一篇 »

如本文对您有帮助,就请抽根烟吧!