Nginx平滑升级版本
Nginx平滑升级版本
一,查看现目前版本,准备预升级版本的安装包
#查看nginx版本
/usr/local/nginx/sbin/nginx -v
#测试nginx访问是否正常,此处开放的为19999端口
#新建下载目录
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 $?
#查看是否编译成功
ls -l /usr/local/nginx-1.23.0/
#查看版本
/usr/local/nginx-1.23.0/sbin/nginx -v
三,升级到新版本
#查看当前版本
/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
这时新的master进程已经正常开启,但老的work进程也存在,所以我们使用下面的命令,将老的work进程发出平滑停止的信号,如下:
kill -WINCH 9629
ps -ef|grep nginx
此时,老的work进程已经停止,接下来我们测试是否能正常访问:
#在查询当前版本
/usr/local/nginx/sbin/nginx -v
#nginx version: nginx/1.23.0
#版本号以改变就代表升级完成
ps -ef|grep nginx
此时可以看见老的master进程还在,如果在版本升级完成后,没有任何问题,需要关闭老的master进程的话,可以使用下面的命令:
kill -QUIT <old_master_PID>
kill -QUIT 9629
到此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
接下来测试是否能正常访问,如果同上面一样可以正常访问,就证明已经回滚成功,这个回滚的操作对用户来说也是不可感知的。