【Nginx】Nginx的版本平滑升级和回退

发布时间:2026/7/30 18:26:20

【Nginx】Nginx的版本平滑升级和回退 前情提要本篇博客将详细介绍Nginx的版本平滑升级和回退的操作流程通过本篇博客你可以实现Nginx业务不暂停的情况下完成Nginx的版本升级或回退。系统RHEL9.3nginx版本nginx version: nginx/1.28.2一、平滑升级流程介绍有时候我们需要对Nginx版本进行升级以满足对其功能的需求例如添加新模块需要新功能而此时 Nginx又在跑着业务无法停掉这时我们就可能选择平滑升级平滑升级流程将旧Nginx二进制文件换成新Nginx程序文件注意先备份)向master进程发送USR2信号master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbinmaster进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx主进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master进 程的PID存放至新生成的pid文件nginx.pid向旧的Nginx服务进程发送WINCH信号使旧的Nginx worker进程平滑停止向旧master进程发送QUIT信号关闭老master并删除Nginx.pid.oldbin文件如果发现升级有问题,可以回滚∶向老master发送HUP向新master发送QUIT二、平滑升级和回滚案例2.1 平滑升级流程2.1.1 下载高版本nginx[rootNginx ~]# wget https://nginx.org/download/nginx-1.29.6.tar.gz2.1.2 解压并编译nginx隐藏版本[rootNginx ~]# tar zxf nginx-1.29.6.tar.gz [rootNginx ~]# cd nginx-1.29.6/ [rootNginx nginx-1.29.6]# ./configure --prefix/usr/local/nginx --usernginx --groupnginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module # 只需要make不要make install [rootNginx nginx-1.29.6]# make # 查看两个nginx版本 [rootNginx nginx-1.29.6]# ll objs/nginx /usr/local/nginx/sbin/nginx -rwxr-xr-x 1 root root 6097248 3月 22 15:53 objs/nginx -rwxr-xr-x 1 root root 5893792 3月 22 14:03 /usr/local/nginx/sbin/nginx2.1.3 nginx命令切换# 将旧的nginx命令备份 [rootNginx nginx-1.29.6]# cd /usr/local/nginx/sbin/ [rootNginx sbin]# cp nginx nginx.28.bak # 将新的nginx命令复制过去 [rootNginx sbin]# cp -p ~/nginx-1.29.6/objs/nginx ./nginx -f cp是否覆盖./nginx yes # 输入yes确认 [rootNginx sbin]# ll 总用量 11712 -rwxr-xr-x 1 root root 6097248 3月 22 15:53 nginx -rwxr-xr-x 1 root root 5893792 3月 22 16:49 nginx.28.bak # 检测 [rootNginx sbin]# nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful2.1.4 平滑升级# 查看nginx的进程 [rootNginx sbin]# ls /usr/local/nginx/logs/ access.log error.log nginx.pid [rootNginx sbin]# ps aux | grep nginx root 5199 0.0 0.0 9916 932 ? Ss 16:47 0:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 5200 0.0 0.1 13812 5268 ? S 16:47 0:00 nginx: worker process root 5292 0.0 0.0 6636 2216 pts/0 S 16:50 0:00 grep --colorauto nginx [rootNginx sbin]# kill -USR2 5199 # USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin并启动新的nginx # 此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80 # 此时Nginx开启一个新的master进程这个master进程会生成新的worker进程这就是升级后的Nginx进程此时老的进程不会自动退出但是当接收到新的请求不作处理而是交给新的进程处理。 [rootNginx sbin]# ps aux | grep nginx root 5199 0.0 0.0 9916 2528 ? Ss 16:47 0:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 5200 0.0 0.1 13812 5268 ? S 16:47 0:00 nginx: worker process root 5293 0.0 0.1 9964 6152 ? S 16:50 0:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 5294 0.0 0.1 13872 4996 ? S 16:50 0:00 nginx: worker process root 5296 0.0 0.0 6636 2212 pts/0 S 16:51 0:00 grep --colorauto nginx [rootNginx sbin]# ls /usr/local/nginx/logs/ access.log error.log nginx.pid nginx.pid.oldbin # 停止旧的进程 # 向旧的master进程发送WINCH信号让它关闭自己的worker [rootNginx sbin]# kill -WINCH 5199 [rootNginx sbin]# ps aux | grep nginx root 5199 0.0 0.0 9916 2528 ? Ss 16:47 0:00 nginx: master process /usr/local/nginx/sbin/nginx root 5293 0.0 0.1 9964 6152 ? S 16:50 0:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 5294 0.0 0.1 13872 4996 ? S 16:50 0:00 nginx: worker process root 5307 0.0 0.0 6636 2192 pts/0 S 16:51 0:00 grep --colorauto nginx # 可见旧的worker进程已经被关闭 # 检测 [rootNginx sbin]# curl -I localhost HTTP/1.1 200 OK Server: nginx/1.29.6 # 新版本生效 Date: Sun, 22 Mar 2026 08:32:16 GMT Content-Type: text/html Content-Length: 615 Last-Modified: Sun, 22 Mar 2026 06:03:42 GMT Connection: keep-alive ETag: 69bf863e-267 Accept-Ranges: bytes2.2 平滑回滚# 如果升级的新版本发现问题需要回滚可以重新拉起旧版本的worker # 备份新版nginx [rootNginx sbin]# cp nginx nginx.29.bak [rootNginx sbin]# ls nginx nginx.28.bak nginx.29.bak [rootNginx sbin]# mv nginx.28.bak nginx mv是否覆盖nginx yes # 输入yes确认覆盖 # nginx重新加载配置文件 [rootNginx sbin]# kill -HUP 5199 # 旧的主进程IDnginx主进程收到信号后会重新加载配置文件并且逐个重启worker进程使用新配置不会中断服务 # 该命令等同于 nginx -s reload 或者 systemctl reload nginx [rootNginx sbin]# ps aux | grep nginx root 5199 0.0 0.0 9916 2528 ? Ss 16:47 0:00 nginx: master process /usr/local/nginx/sbin/nginx root 5293 0.0 0.1 9964 6152 ? S 16:50 0:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 5294 0.0 0.1 13872 4996 ? S 16:50 0:00 nginx: worker process nginx 5325 0.0 0.1 13812 4756 ? S 16:58 0:00 nginx: worker process root 5329 0.0 0.0 6636 2212 pts/0 S 16:58 0:00 grep --colorauto nginx # 可见旧版本的worker进程又重新启动 [rootNginx sbin]# kill -WINCH 5293 # 回收新版本的worker进程 [rootNginx sbin]# ps aux | grep nginx root 5199 0.0 0.0 9916 2528 ? Ss 16:47 0:00 nginx: master process /usr/local/nginx/sbin/nginx root 5293 0.0 0.1 9964 6152 ? S 16:50 0:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 5325 0.0 0.1 13812 4756 ? S 16:58 0:00 nginx: worker process root 5331 0.0 0.0 6636 2212 pts/0 S 17:00 0:00 grep --colorauto nginx # 检测 [rootNginx sbin]# curl -I localhost HTTP/1.1 200 OK Server: nginx/1.28.2 # 可见版本回退成功 Date: Sun, 22 Mar 2026 09:01:15 GMT Content-Type: text/html Content-Length: 615 Last-Modified: Sun, 22 Mar 2026 08:47:28 GMT Connection: keep-alive ETag: 69bfaca0-267 Accept-Ranges: bytes至此nginx平滑升级和回滚均完毕

相关新闻