探究 Nginx 中 reload 流程的真相

今天这篇文章主要来介绍下 Nginx 的 reload 流程。实际上在以前文章中,在更改了 nginx 配置文件时,咱们都会执行 nginx -s reload 命令,咱们执行这条命令的缘由是但愿 nginx 不中止服务始终在处理新的请求的同时把 nginx 的配置文件平滑的把旧的 nginx.conf 配置更新为新的 nginx.conf 配置。linux

这样一个功能对于 nginx 很是有必要,可是有时候咱们会发如今执行 nginx -s reload 命令后,worker 子进程的数量会变多了,这是由于老的配置运行的 worker 进程长时间没有退出,当使用 stream 作四层反向代理的时候,可能这种场景会更多。nginx

那么下面咱们经过分析 nginx 的 reload 流程,来探究下 nginx 到底作了些什么?所谓优雅的退出和当即退出有什么区别?web

reload 流程

探究 Nginx 中 reload 流程的真相

第一步在修改好 nginx 的配置文件 nginx.conf 后,向 master 进程发送 HUP 信号,这实际上和咱们在命令行执行 nginx -s reload 命令效果是同样的。服务器

那么 master 进程在收到 HUP 信号之后,会在第二步检查咱们的配置文件语法是否正确,也就是说咱们并不必定非要在 nginx -s reload 前执行 nginx -t 检验下语法是否正确,由于在第二步 nginx 的 master 进程必定会执行这个步骤。ide

在 nginx 的配置语法所有正确之后,master 进程会打开新的监听端口,为何要在 master 进程中打开新的监听端口?由于咱们可能在 nginx.conf 中会引入新的例如 443 或者以前咱们没有打开的的监听端口,而全部 worker 进程是 master 进程 的子进程,子进程会继承父进程全部已经打开的端口,这是 linux 操做系统定义的,因此第三步,咱们 master 进程打开了可能引入的新的监听端口。操作系统

接下来 mster 进程会用新的 nginx.conf 配置文件来启动新的 worker 子进程,那么老的 worker 子进程会怎么样呢?命令行

咱们会在第五步在启动新的 worker 子进程之后,由 master 进程再向老 worker 子进程发送 QUIT 信号,QUIT 信号和 TERM,INT 信号是不同的,QUIT 信号是请优雅地关闭子进程,这时候须要关注顺序,由于 nginx 须要保证平滑,因此要先启动新的 worker 子进程,再向老的 worker 子进程发送 QUIT 信号。3d

那么老的 master 子进程收到 QUIT 信号后,首先关闭监听句柄,也就是说这个时候新的链接只会到新的 worker 子进程,因此虽然他们之间有时间差,可是时间是很是快速的,那么关闭监听句柄后,处理完当前链接后就结束进程。代理

下面看 reload 不停机载入新配置的图示。日志

reload 不停机载入新配置

探究 Nginx 中 reload 流程的真相

master 进程上原先有四个绿色的 worker 子进程,它们使用了老的配置,当咱们更改了 nginx.conf 配置文件后,向 master 发送 SIGHUP 信号或者执行 reload 命令, 而后 master 会用新的配置文件启动四个新的黄色 worker 子进程,此时是四个老的绿色 worker 子进程和四个新的黄色的 worker 子进程是并存的。那么老的 worker 子进程在正常的状况下会在处理已经创建好的链接上的请求以后关闭这个链接,哪怕这个链接是 keeplive 请求也会正常关闭。

可是异常状况,若是有一些请求出现问题,客户端长时间没法处理,那么就会致使这个请求长时间停留在这个 worker 子进程当中,那么这个 worker 子进程会长时间存在,由于新的链接已经跑在黄色的 worker 子进程中,因此影响并不会很大,惟一会影响的就是绿色的 worker 子进程会长时间存在,但也只影响已存在的链接,不会影响新的链接。

咱们有什么办法处理呢?在新版本中提供了一个新的配置 worker_shutdown_timeout,也就是说最长等待多长时间,这样 master 进程启动新的黄色 worker 进程以后,若是老的 worker 进程一直没有退出,时间到了以后会强制把老的 worker 进程退出掉。

总结

本文主要讲解了 Nginx 平滑升级新的配置文件的流程,在咱们了解了优雅关闭 worker 子进程和启动新配置的 worker 子进程流程间的关系后,咱们能够更好地处理罕见的异常场景。

●使用 Nginx 搭建静态资源 web 服务器
●Nginx 热部署和日志切割,你学会了吗?
●Nginx 了解一下?
●Nginx 的请求处理流程,你了解吗?
●Nginx 的进程结构,你明白吗?
●Nginx 进程管理,你须要了解哪些?

探究 Nginx 中 reload 流程的真相

武培轩有帮助?在看,转发走一波喜欢做者

相关文章
相关标签/搜索