Nginx 的平滑升级
Posted 锦衣admin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx 的平滑升级相关的知识,希望对你有一定的参考价值。
信号参数
Kill 命令 传输信号给进程 Nginx的主进程,以下几个命令都是发送给Nginx的master 进程的
# TERM, INT(快速退出,当前的请求不执行完成就退出) -s stop
# QUIT (优雅退出,执行完当前的请求后退出) -s quit
# HUP (重新加载配置文件,用新的配置文件启动新worker进程,并优雅的关闭旧的worker进程) -s reload
# USR1 (重新打开日志文件) -s reopen
# USR2 (平滑的升级nginx二进制文件 拉起一个新的主进程 旧主进程不停止)
# WINCH (优雅的关闭worker进程),关闭后想在起worker进程,重启服务或者 kill -HUP master进程
Nginx 重新安装
①停止掉服务,删除编译的安装的软件包和源码包
②重新解压编译安装即可
注意:如果有需要,请备份配置文件和网站目录里的资源文件
Nginx 平滑升级版本
升级软件版本之后,需要启动新的版本,启动不了,端口已经被占用,如果直接把旧版本的服务停止掉,会影响线上业务的使用,所以需要在不关闭Nginx 的情况下进行平滑升级
手动平滑升级
平滑升级思路:
① 旧的不先停掉
② 新的又可以起来
③ 旧的和新的同时提供服务,旧的请求完成之后,就停掉旧进程
-USR2
平滑启动一个进程(平滑升级)
-WINCH
优雅的关闭子进程
-QUIT
优雅关闭主进程
第一步:上传新版本源码,并且编译安装
- 在不关闭Nginx服务的情况进行编译安装,新版本编译配置的参数需要和旧版本的一致
- 升级新版本,需要把软件的安装路径,指定到旧版本上。
- 以下操作完成之后,会把原来的旧版本备份为nginx.old,即sbin/ 目录下会有两个Nginx执行文件
# cd /usr/local/nginx/sbin/
#l ./nginx -V => 查看旧版本的配置参数
# tar xf nginx-1.16.0.tar.gz => 进入到上传新版本的目录解压
# cd nginx-1.16.0
#l ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module
=> 注意:还是旧版本的配置参数
# make && make install
第二步:给旧版本的主进程好发送一个平滑升级的信号
# ps -ef|grep nginx => 查看Nginx主进程号,此时只有旧版本的进程
# kill -USR2 主进程号 => 发送完毕后,会拉起两个主进程,一个旧的一个新的
第三步:停止旧版本的进程
- 查看旧的主进程号,并使用kill -WINCH 优雅的关闭的子进程,再关闭旧的主进程
# kill -WINCH 旧的主进程号
# kill -QUIT 旧的主进程号
自动平滑升级
- 在nginx中,默认提供了平滑升级的操作,前面步骤和手动升级一样,在配置完和旧版本一样的参数后
- 编译安装的时候多加一个参数,配置完后会产生一个
Makefile
里面有关于upgrade的说明
编译安装:
# cd /usr/local/nginx/sbin/
#l ./nginx -V => 查看旧版本的配置参数
# tar xf nginx-1.16.0.tar.gz => 进入到上传新版本的目录解压
# cd nginx-1.16.0
#l ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module
=> 注意:还是旧版本的配置参数
# make && make install && make upgrade => 增加make upgrade 会自动实现平滑升级
以上两种方式可以实现Nginx的平滑升级
注意:如果用systemd服务事先启动的Nginx,有可能平滑升级后Nginx进程会停止,用Nginx的二进制可执行程序执行没问题
用回旧版本
第一步:删除sbin/目录下的nginx执行程序
# cd /usr/local/nginx/sbin/
# rm -rf nginx => 将新版本的执行程序删掉
# mv nginx.old nginx => 将旧版本的改回
# systemctl restart nginx => 重新启动即可
以上是关于Nginx 的平滑升级的主要内容,如果未能解决你的问题,请参考以下文章