线上nginx平滑升级

一、解释nginx的平滑升级

随着nginx越来越流行使用,并且nginx的优势也越来越明显,nginx的版本迭代也开始了加速模式,1.9.0版本的nginx更新了许多新功能,例如stream四层代理功能。伴随着nginx的广泛应用,版本升级必然是越来越快的,线上业务不能停,此时nginx的升级就是运维的重要工作了,下面就带大家一起来理解下nginx平滑升级。

二、nginx平滑升级原理

多进程模式下的请求分配方式

Nginx默认工作在多进程模式下,即主进程(master process)启动后完成配置加载和端口绑定等动作,fork出指定数量的工作进程(worker process),这些子进程会持有监听端口的文件描述符(fd),并通过在该描述符上添加监听事件来接受连接(accept)。

信号的接收和处理

Nginx主进程在启动完成后会进入等待状态,负责响应各类系统消息,如SIGCHLD、SIGHUP、SIGUSR2等。

Nginx信号简介

主进程支持的信号

  • TERMINT: 立刻退出
  • QUIT: 等待工作进程结束后再退出
  • KILL: 强制终止进程
  • HUP: 重新加载配置文件,使用新的配置启动工作进程,并逐步关闭旧进程。
  • USR1: 重新打开日志文件
  • USR2: 启动新的主进程,实现热升级
  • WINCH: 逐步关闭工作进程

工作进程支持的信号

  • TERMINT: 立刻退出
  • QUIT: 等待请求处理结束后再退出
  • USR1: 重新打开日志文件

三、nginx平滑升级实战

3.1 备份原Nginx二进制文件

备份二进制文件和nginx的配置文件

  1. [root@iZ28t900vpcZ ~]#cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_$(date +%F)
  2. [root@iZ28t900vpcZ ~]#cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf_$(date +%F)

3.2 编译新的nginx源码包

编译新Nginx源码,安装路径需与旧版一致

  1. [root@iZ28t900vpcZ nginx-1.9.12]#./configure --prefix=/usr/local/nginx-1.9.12 --user=www --group=www --with-http_ssl_module --with-openssl=/path/to/openssl_src
  2. [root@iZ28t900vpcZ nginx-1.9.12]#make&make install

3.3 发送USR2信号

向主进程发送USR2信号,Nginx会启动一个新版本的master进程和工作进程,和旧版一起处理请求

  1. [root@iZ28t900vpcZ ~]# ps -ef|grep nginx|grep -v grep
  2. root 900 1 0 Mar07 ? 00:00:00 nginx: master process /usr/local/openresty/nginx/sbin/nginx
  3. nginx 28475 900 0 11:32 ? 00:00:00 nginx: worker process
  4. [root@iZ28t900vpcZ ~]#kill -USR2 900

3.4 发送WITCH信号

向原Nginx主进程发送WINCH信号,它会逐步关闭旗下的工作进程(主进程不退出),这时所有请求都会由新版Nginx处理

  1. [root@iZ28t900vpcZ ~]#kill -WITCH 900

3.5 发送HUP信号

如果这时需要回退,可向原Nginx主进程发送HUP信号,它会重新启动工作进程, 仍使用旧版配置文件 。然后可以将新版Nginx进程杀死(使用QUIT、TERM、或者KILL)

  1. [root@iZ28t900vpcZ ~]#kill -HUP 900

注:此步骤只需在回滚的时候执行即可

3.6 升级完毕

如果不需要回滚,可以将原Nginx主进程杀死(使用QUIT、TERM、或者KILL),至此完成热升级。

你可能感兴趣的:(nginx,运维)