吸收了这个教训之后,我们需要更加合理地关闭我们的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对应的消息,最终无缝实现了重启操作。

这里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信号集实例分析的详细内容,更多请关注主机测评网其它相关文章!
本文来源:国外服务器--nginx信号集实例分析(nginx详细讲解)
本文地址:https://www.idcbaba.com/guowai/5814.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 1919100645@qq.com 举报,一经查实,本站将立刻删除。




