探究Nginx中reload流程的原理真相

 更新时间:2019年12月16日 11:30:59   作者:武培轩  
这篇文章主要介绍了探究Nginx中reload流程的原理真相,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

那么下面我们通过分析 nginx 的 reload 流程,来探究下 nginx 到底做了些什么?所谓优雅的退出和立即退出有什么区别?

reload 流程

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

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

在 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 信号。

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

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

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中default_server指令问题详解

    Nginx中default_server指令问题详解

    nginx 的 default_server 指令可以定义默认的 server 出处理一些没有成功匹配 server_name 的请求,下面这篇文章主要给大家介绍了关于Nginx中default_server指令问题的相关资料,需要的朋友可以参考下
    2022-12-12
  • 在服务器上启用HTTPS的详细教程

    在服务器上启用HTTPS的详细教程

    这篇文章主要介绍了在服务器上启用HTTPS的详细教程,包括在AWS中生成SSL证书以及在Nginx上的相关配置等,极力推荐!需要的朋友可以参考下
    2015-06-06
  • 很详细的Nginx配置说明

    很详细的Nginx配置说明

    这篇文章主要为大家分享了一篇很详细的Nginx配置说明,主要内容包括Nginx常用功能、Nginx配置文件结构,想要了解Nginx配置的朋友不要错过,参考一下
    2016-02-02
  • 使用nginx正向代理实现访问外网

    使用nginx正向代理实现访问外网

    这篇文章主要介绍了使用nginx正向代理实现让内网主机通过外网主机访问外网,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • 如何利用map实现Nginx允许多个域名跨域

    如何利用map实现Nginx允许多个域名跨域

    这篇文章主要给大家介绍了关于如何利用map实现Nginx允许多个域名跨域的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • nginx 多站点配置方法集合

    nginx 多站点配置方法集合

    关于nginx的多站设置,其实和apache很相似,假设我们已经有两个域名,分别是:www.websuitA.com和www.websuitB.com。并且这两个域名已经映射给了IP为192.168.1.1的服务器。
    2011-06-06
  • Nginx学习笔记之事件驱动框架处理流程

    Nginx学习笔记之事件驱动框架处理流程

    Nginx对请求的处理是通过事件触发的,模块作为事件消费者,只能被事件收集、分发器调用。在Nginx中,接收到一个请求时,不会产生一个单独的进程来处理该请求,而是由事件收集、分发器(进程)调用某个模块,由模块处理请求,处理完后再返回到事件收集、分发器
    2014-07-07
  • Nginx Lua 根据参数请求转发的实现

    Nginx Lua 根据参数请求转发的实现

    本文介绍了如何使用Nginx和Lua脚本实现基于参数的请求转发,文章详细说明了配置方法,并提供了示例代码,帮助读者理解如何通过NginxLua模块根据请求参数将流量转发到不同后端服务,这种方法有助于实现灵活的负载均衡和动态内容处理
    2022-05-05
  • 详解Nginx如何配置Web服务器的示例代码

    详解Nginx如何配置Web服务器的示例代码

    这篇文章主要介绍了详解 Nginx如何配置Web服务器的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 使用Nginx解决前端跨域问题

    使用Nginx解决前端跨域问题

    这篇文章主要为大家详细介绍了使用Nginx解决前端跨域问题的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12

最新评论