Nginx 升级,平滑升级不停服务

Nginx 平滑升级

因为nginx漏洞需要升级nginx ,找了资料,记录一下操作步骤

备份

备份配置文件

cp -r /home/admin/nginx/conf /home/admin/nginx/conf_bak_$(date +%Y%m%d)

备份二进制文件

cp /home/admin/nginx/sbin/nginx /home/admin/nginx/sbin/nginx.old

下载新版本nginx

https://nginx.org/en/download.html

解压nginx

tar -xzvf nginx-1.30.2.tar.gz

查看旧版本参数 /home/admin/nginx/sbin/nginx -V

configure arguments: --prefix=/home/admin/nginx22 --with-http_stub_status_module --with-http_ssl_module

使用旧版本参数编译新版本(只mark,不mark install)

cd nginx-1.30.2

./configure --prefix=/home/admin/nginx --with-http_stub_status_module --with-http_ssl_module

make

mv 备份旧文件

mv /home/admin/nginx/sbin/nginx /home/admin/nginx/sbin/nginx.old.bak

复制新二进制文件

cp /home/admin/nginx-1.30.2/objs/nginx /home/admin/nginx/sbin/nginx

找到旧 master 进程 PID

cat /home/admin/nginx/logs/nginx.pid

发送 USR2 信号 → 启动新版本 master 进程(接管端口)

kill -USR2 15352

验证新 master 已启动

ps aux | grep nginx

应看到两个 master

旧 master PID 保存在 nginx.pid.oldbin 中

cat /home/admin/nginx/logs/nginx.pid.oldbin # 记录旧 master PID,回滚要用

发送 WINCH 信号 → 旧 master 逐步关闭旧 worker

kill -WINCH 15352

等待几秒后,旧 worker 应全部退出

sleep 3

ps aux | grep nginx | grep worker

确认没有旧版本的 worker 了

发送 QUIT 信号 → 优雅关闭旧 master

kill -QUIT 15352

验证

看版本

/home/admin/nginx/sbin/nginx -V

看进程(不会有两个master)

ps aux | grep nginx

看配置

/home/admin/nginx/sbin/nginx -t

异常回滚

阶段A 回滚(刚发 USR2,最快)

旧 Master 还在,旧 Worker 还在,直接切回去

① 旧 Master 重新接管(发 HUP 重新加载配置)

kill -HUP $(cat /home/admin/nginx22/logs/nginx.pid.oldbin)

② 新 Master 退出

kill -QUIT $(cat /home/admin/nginx22/logs/nginx.pid)

③ 验证回滚成功

/home/admin/nginx22/sbin/nginx -v

应该显示旧版本号

阶段B 回滚(已发 WINCH,旧 Worker 已退出)

旧 Worker 已经死了,但旧 Master 还在,需要先让旧 Master 重新拉起 Worker

① 旧 Master 重新加载配置(会自动拉起新 Worker)

kill -HUP $(cat /home/admin/nginx22/logs/nginx.pid.oldbin)

② 等待几秒,确认旧 Worker 已启动

ps aux | grep nginx | grep -v grep

③ 新 Master 退出

kill -QUIT $(cat /home/admin/nginx22/logs/nginx.pid)

④ 验证

/home/admin/nginx22/sbin/nginx -v

阶段C 回滚(已发 QUIT,旧 Master 已死,最坏情况)

旧 Master 已经退出了,只能用备份的 nginx.old 重启

停止新版本

kill -QUIT $(cat /home/admin/nginx22/logs/nginx.pid)

恢复旧二进制

cp /home/admin/nginx22/sbin/nginx.old /home/admin/nginx22/sbin/nginx

启动旧版本

/home/admin/nginx22/sbin/nginx

相关推荐
anew___13 小时前
《从零手写操作系统 (63):安全与加固——从内核保护到沙箱隔离》
网络·安全
Lzg_na13 小时前
VXLAN:背景、机制、报文字段与主机转发流程
网络
Android系统攻城狮15 小时前
Linux FFmpeg深度解析之avcodec_default_get_encode_buffer调用流程与实战(二十八)
linux·运维·服务器·ffmpeg·车载音视频·ffmpeg音视频
乐维_lwops15 小时前
案例解读:大型综合性科创产业园运维监控落地实践
运维·网络·人工智能·安全·it监控·国产运维智能体
番茄啊17 小时前
linux 开启xftp连接
linux·运维·服务器
m0_7156744317 小时前
政务泛监测体系能力排行:AI 重塑监测边界,治理的颗粒度革命
大数据·网络·人工智能·安全·网络安全·政务
Lsetea17 小时前
Docker更新SSL证书后容器仍读旧文件:单文件挂载与目录挂载排查
运维·nginx·docker·https·ssl证书
AI 编程助手GPT18 小时前
curl 返回成功就能收文件?用本地 HTTP 验证错误页与超时
网络·网络协议·http
Julien200418 小时前
管理机密(一)
运维·服务器·开发语言·学习方法
十碗饭吃不饱19 小时前
后端运维:网络联通、进程查询、Java服务启动脚本
java·运维·网络