一、解释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信号简介
主进程支持的信号
TERM
,INT
: 立刻退出QUIT
: 等待工作进程结束后再退出KILL
: 强制终止进程HUP
: 重新加载配置文件,使用新的配置启动工作进程,并逐步关闭旧进程。USR1
: 重新打开日志文件USR2
: 启动新的主进程,实现热升级WINCH
: 逐步关闭工作进程
工作进程支持的信号
TERM
,INT
: 立刻退出QUIT
: 等待请求处理结束后再退出USR1
: 重新打开日志文件
三、nginx平滑升级实战
3.1 备份原Nginx二进制文件
备份二进制文件和nginx的配置文件
[root@iZ28t900vpcZ ~]#cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_$(date +%F)
[root@iZ28t900vpcZ ~]#cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf_$(date +%F)
3.2 编译新的nginx源码包
编译新Nginx源码,安装路径需与旧版一致
[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
[root@iZ28t900vpcZ nginx-1.9.12]#make&make install
3.3 发送USR2信号
向主进程发送USR2信号,Nginx会启动一个新版本的master进程和工作进程,和旧版一起处理请求
[root@iZ28t900vpcZ ~]# ps -ef|grep nginx|grep -v grep
root 900 1 0 Mar07 ? 00:00:00 nginx: master process /usr/local/openresty/nginx/sbin/nginx
nginx 28475 900 0 11:32 ? 00:00:00 nginx: worker process
[root@iZ28t900vpcZ ~]#kill -USR2 900
3.4 发送WITCH信号
向原Nginx主进程发送WINCH信号,它会逐步关闭旗下的工作进程(主进程不退出),这时所有请求都会由新版Nginx处理
[root@iZ28t900vpcZ ~]#kill -WITCH 900
3.5 发送HUP信号
如果这时需要回退,可向原Nginx主进程发送HUP信号,它会重新启动工作进程, 仍使用旧版配置文件 。然后可以将新版Nginx进程杀死(使用QUIT、TERM、或者KILL)
[root@iZ28t900vpcZ ~]#kill -HUP 900
注:此步骤只需在回滚的时候执行即可
3.6 升级完毕
如果不需要回滚,可以将原Nginx主进程杀死(使用QUIT、TERM、或者KILL),至此完成热升级。