Nginx学习笔记之热升级的完整流程

声明:图片来自  github:https://github.com/russelltao/geektime-nginx 

热升级的完整流程


  • 在nginx不停止服务的情况下,更换它的二进制文件,这个功能非常有用,但我们在执行nginx 二进制文件升级过程中,还是可能会遇到很多问题,比如老的worker进程一直退不掉,新的worker进程升级以后出现了新的问题,我们要考虑回滚,或者我们升级了新的nginx文件以后,会发现很多我们预期功能指向的配置文件出现了错误。下面介绍热升级的流程是怎样进行的。

热升级流程

  • 将旧Nginx文件换成新Nginx文件(注意备份)
    • 只替换二进制文件。
    • 大部分场景下,我们新编译的nginx文件所指定的相应的配置选项,比如说配置文件的目录在哪里,log所在的目录在哪里等等,必须保持和老的nginx是一致的,否则我们无法复用nginx conf文件
    • 如果我们只替换二进制文件,请注意我们要备份。在替换的时候,新版本的linux中要求你在覆盖一个正在使用的文件时,加上 -f。
  • 向master进程发送USR2信号
    • 现在我们向老的nginx其中master进程发送USR2,这时我们注意到,我们无法通过nginx命令行直接用nginx -s 加一个信号来处理,这是因为nginx到目前为止还没有实施这样的信号。发送完USR2信号以后,现有的master进程会做以下几件事。
  • master进程修改pid文件名,加后缀.oldbin 
    • 这样做是为了给新的master进程让路。
    • master进程和worker进程,虽然他们都可以接受信号,但是为了管理方便,我们通常不会对worker进程直接发送信号,所以我们依赖于master进程,它必须把它的pid保存下来。
    • 为了给新的master让它使用 pid.bin 这样一个文件名,所以我们先把老的pid文件改名。 
  • master进程用新Nginx文件启动新master进程
    • 我们用新的二进制文件启动新的master进程,所以到此为止会出现两个master进程和老的worker进程。
    • 新的master进程会自动地去启动新的worker进程。
  • 向老master进程发送QUIT信号,关闭老master
    • 怎样找到老的master进程,我们需要用ps看到master进程的进程号或者通过.oldbin文件找到老的master进程的进程号向这个进程号发送信号。
    • 老的master进程会优雅的关闭老的worker进程。这样的话,我们的热升级就结束了。
  • 回滚:向老master发送HUP,向新master发送QUIT
    • 但是老的master进程一直是保存下来的,这是为什么?
      • 方便我们回滚,也就是发现新的nginx程序有问题了,这时候因为老的master进程还在,所以我们通过向它发送HUP信号,相当于执行了一次reload,它会起新的worker进程,再向新的master发送QUIT信号,也就是要求其对应的新的worker进程优雅的退出,这就实现了一个回滚。

热升级流程图

  • 如图(从左往右),一开始老的master进程启动了四个绿色的worker进程。
    • 当我们更新了nginx的二进制文件以后,向老的master进程发送SIGUSR2信号,这时候老的master进程会把自己的pid文件改名。这时我们认为它是黄色的这样进程。
    • 启动新的master进程是怎样起的呢?它起了一个新的子进程,也就是说新的master进程是老的master进程的子进程,但是这个子进程是使用了新的二进制文件载入来启动的
    • 所以上是这样一个流程,在中间的时候,新老nginx并存,但老的master开始关闭监听端口,然后所有的(黄色的)老的worker进程开始优雅地退出。在完成以后,就只有新的master进程存在了这样一个场景。
  • 以上可以通过热升级实现不停机,更新我们的nginx这为我们持续地使用nginx新特性提供了帮助

猜你喜欢

转载自blog.csdn.net/baidu_41388533/article/details/106900607