nginx平滑升级和回滚-创新互联
有时候需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时Nginx 又在跑着业务无法停止,这时就可以选择平滑升级
成都创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站制作、成都做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的鄠邑网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!平滑升级可以分为四个阶段:- 只有旧版nginx的master和worker进程
- 旧版和新版nginx的master和worker进程并存,由旧版nginx接收处理用户的新请求(注意:做快照方 便测试回滚)
- 旧版和新版nginx的master和worker进程并存,由新版nginx接收处理用户的新请求
- 只有新版nginx的master和worker进程
- 将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
- 向master进程发送USR2信号启动新nginx进程 master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin master进程用新Nginx文件启动新master进程及worker子进程成为旧master的子进程 系统中将有新旧两个Nginx主进程和对应的worker子进程并存 当前新的请求仍然由旧Nginx的worker进程进行处理 将新生成的master进程的PID存放至新生成的pid文件nginx.pid
- 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止 当前新的请求由新Nginx的worker进程进行处理
- 向旧master进程发送QUIT信号,关闭旧master,并删除Nginx.pid.oldbin文件
- 如果发现升级有问题,可以回滚∶向旧master发送HUP,向新master发送QUIT
#本文旧版nginx为1.18.0,升级为1.20.1
#实验环境为centos7
一.平滑升级 1.下载压缩包并解压,切换到nginx-1.20.1目录下[root@nginx ~]#wget http://nginx.org/download/nginx-1.20.1.tar.gz
[root@nginx ~]#tar xvf nginx-1.20.1.tar.gz
[root@nginx ~]#cd nginx-1.20.1
2.查看当前使用的nginx版本及编译参数信息[root@nginx nginx-1.20.1]#/apps/nginx/sbin/nginx -V
#版本
nginx version: nginx/1.18.0 built by gcc 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC) built with OpenSSL 1.1.1g FIPS 21 Apr 2020 TLS SNI support enabled
#编译参数
configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --withhttp_ssl_module --with-http_v2_module --with-http_realip_module --withhttp_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
3.开始编译新版本,参数使用上面一样的[root@nginx nginx-1.20.1]#./configure --prefix=/apps/nginx --user=nginx -- group=nginx --with-http_ssl_module --with-http_v2_module --withhttp_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
4.只编译,不安装[root@nginx nginx-1.20.1]#make
#这里是升级,只需make无需make install
5.验证版本信息是否正确[root@nginx nginx-1.20.1]#objs/nginx -v
nginx version: nginx/1.20.1
6.备份旧版nginx的程序文件[root@nginx nginx-1.20.1]#cp /apps/nginx/sbin/nginx /opt/nginx.old
7.用新版nginx的程序文件覆盖旧版的程序文件[root@nginx nginx-1.20.1]#cp -f ./objs/nginx /apps/nginx/sbin/
#注意:需要加 -f 选项强制覆盖,否则会提示Text file busy
如果cp 不加-f 选项,会出现下面提示:
[root@nginx nginx-1.20.1]#cp objs/nginx /apps/nginx/sbin/
cp: overwrite '/apps/nginx/sbin/nginx'? y
cp: cannot create regular file '/apps/nginx/sbin/nginx': Text file busy
8.检查新版程序文件有没有问题[root@nginx nginx-1.20.1]#/apps/nginx/sbin/nginx -t
9.向旧版nginx的master进程发送USR2信号此处有两种写法:
[root@nginx nginx-1.20.1]#kill -USR2 `cat /apps/nginx/logs/nginx.pid`
[root@nginx nginx-1.20.1]#kill -USR2 '旧版nginx的master进程编号'
#发送信号USR2,平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx
#此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80
#此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进 程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理
#如上图,可以看到,新版nginx的master进程编号为15314,旧版为12271
10.查看进程信息#可以看到两个master进程,新的master是旧版master的子进程,并生成新版的worker进程
#此时新版和旧版处于共存状态
11.向旧版nginx的master进程发送WINCH信号#此处两种写法:
[root@nginx nginx-1.20.1]#kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin`
[root@nginx nginx-1.20.1]#kill -WINCH '旧版nginx的master进程编号`
12.查看进程信息#先关闭旧版nginx的worker进程,而不关闭nginx主进程方便回滚
#向原Nginx主进程发送WINCH信号,它会逐步关闭旗下的工作进程(主进程不退出),这时所有请求都会由新 版Nginx处理
#如果旧版worker进程有用户的请求,会一直等待处理完后才会关闭
#此时旧版和新版还是处于共存状态
13.向旧版nginx的master进程发送quit信号此处两种写法:
[root@nginx nginx-1.20.1]#kill -QUIT `cat /apps/nginx/logs/nginx.pid.oldbin`
[root@nginx nginx-1.20.1]#kill -QUIT '旧版nginx的master进程编号'
14.查看进程信息#经过一段时间测试,新版nginx服务没问题,最后发送QUIT信号,退出旧版的master
#此时旧版已下线,新版正式上线
15.查看当前版本信息[root@nginx logs]# nginx -v
nginx version: nginx/1.20.1
此处两种写法:
[root@nginx nginx-1.20.1]#kill -HUP `cat /apps/nginx/logs/nginx.pid.oldbin`
[root@nginx nginx-1.20.1]#kill -HUP '旧版nginx的master进程编号'
2.查看进程信息[root@nginx logs]# ps -aux | grep nginx
root 12271 0.0 0.0 46208 1352 ? Ss 19:26 0:00 nginx: master process/apps/nginx/sbin/nginx
root 15314 0.0 0.1 46220 3368 ? S 19:32 0:00 nginx: master process /apps/nginx/sbin/nginx
nginx 15315 0.0 0.0 46672 1916 ? S 19:32 0:00 nginx: worker process
nginx 8607 0.0 0.0 46652 1908 ? S 19:56 0:00 nginx: worker process
root 8611 0.0 0.0 112824 980 pts/3 S+ 19:57 0:00 grep --color=auto nginx
[root@nginx logs]# pstree -p | grep nginx
|-nginx(12271)-+-nginx(15314)---nginx(15315)
| `-nginx(8607)
#如果升级的版本发现问题需要回滚,可以发送HUP信号,重新拉起旧版本的worker
3.向新版nginx发送QUIT信号[root@nginx logs]#kill -QUIT `cat /apps/nginx/logs/nginx.pid`
#关闭新版nginx的master进程
4.将备份的旧版nginx程序文件覆盖新版nginx文件[root@nginx logs]# cp -f /opt/nginx.old /apps/nginx/sbin/nginx
cp:是否覆盖"/apps/nginx/sbin/nginx"? y
[root@nginx logs]# nginx -v
nginx version: nginx/1.18.0
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
文章名称:nginx平滑升级和回滚-创新互联
网页链接:http://scjbc.cn/article/csjdgj.html