Nginx平滑升级版本

一,查看现目前版本,准备预升级版本的安装包

#查看nginx版本
/usr/local/nginx/sbin/nginx -v
#测试nginx访问是否正常,此处开放的为19999端口

image-20220929144714812

image-20220929153350579

#新建下载目录
mkdir -p /home/nginx
#下载预升级版本的安装包
wget -c https://nginx.org/download/nginx-1.23.0.tar.gz
#解压
tar zxf nginx-1.23.0.tar.gz

二,编译安装新版本

#进入解压目录
cd /home/nginx/nginx-1.23.0/
#使用默认配置并指定配置目录
./configure --prefix=/usr/local/nginx-1.23.0
#查看是否报错
echo $?
#编译安装
make && make install
echo $?

image-20220929160823860

image-20220929160846411

#查看是否编译成功
ls -l /usr/local/nginx-1.23.0/
#查看版本
/usr/local/nginx-1.23.0/sbin/nginx -v

image-20220929160948373

image-20220929161059620

三,升级到新版本

#查看当前版本
/usr/local/nginx/sbin/nginx -v
#nginx version: nginx/1.13.7
cd /usr/local/nginx/sbin/
#备份原有nginx二进制文件
mv nginx nginxback
#拷贝新的二进制文件到该目录
cp /usr/local/nginx-1.23.0/sbin/nginx ./

随后进行平滑升级

#查看当前运行nginx的进程号
ps -ef|grep nginx
#
kill -USR2 9629
ps -ef|grep nginx

image-20220929165816707

这时新的master进程已经正常开启,但老的work进程也存在,所以我们使用下面的命令,将老的work进程发出平滑停止的信号,如下:

kill -WINCH 9629
ps -ef|grep nginx

image-20220929171101138

此时,老的work进程已经停止,接下来我们测试是否能正常访问:

image-20220929171147079

#在查询当前版本
/usr/local/nginx/sbin/nginx -v
#nginx version: nginx/1.23.0
#版本号以改变就代表升级完成
ps -ef|grep nginx

image-20220929171355754

此时可以看见老的master进程还在,如果在版本升级完成后,没有任何问题,需要关闭老的master进程的话,可以使用下面的命令:

kill -QUIT <old_master_PID>
kill -QUIT 9629

image-20220929173154190

到此nginx平滑升级就结束了,平滑升级的好处在于不用停止ginx服务,对访问用户来说是完全感知不到,所以nginx热部署就已经完成了。

四,如果在升级之后发现因版本问题不兼容应用程序,怎么回退

在上面的结果中,我们也能看到老的master进程是一直存在,在没有手工关闭前,它是不会自已关闭的,这种设计是有好处的,好处就是为了升级新版本后,如果出现问题能及时快速的回滚到上一个稳定版本。

也就是说,在检查出没问题前,请务必不执行以下指令。

kill -QUIT <old_master_PID>

——下面是回退的操作——

ps -ef|grep nginx
#root      9629     1  0 14:18 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c #/usr/local/nginx/conf/nginx.conf
#root     20858  9629  0 14:33 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c #/usr/local/nginx/conf/nginx.conf
#nobody   20859 20858  0 14:33 ?        00:00:00 nginx: worker process
#root     22774 19064  0 14:37 pts/0    00:00:00 grep --color=auto nginx
cd /usr/local/nginx/sbin/
#重命名nginx二进制文件
mv nginx nginx-1.23.0
#把之前备份的修改回来
mv nginxback nginx
kill -USR1 9629
ps -ef|grep nginx
#root      9629     1  0 14:18 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c #/usr/local/nginx/conf/nginx.conf
#root     20858  9629  0 14:33 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c #/usr/local/nginx/conf/nginx.conf
#nobody   20859 20858  0 14:33 ?        00:00:00 nginx: worker process
#root     22774 19064  0 14:37 pts/0    00:00:00 grep --color=auto nginx
./nginx -v
#nginx version: nginx/1.13.7

接下来测试是否能正常访问,如果同上面一样可以正常访问,就证明已经回滚成功,这个回滚的操作对用户来说也是不可感知的。