双机热备下nginx平滑升级需分架构实施:keepalived+vip模式须先切主备再逐节点升级;dns/lb直连架构则依赖健康检查可控摘流+usr2/winch/quit信号完成进程优雅更新,全程零中断。

双机热备环境下的 Nginx 平滑升级,核心目标是:**单节点升级时,另一节点持续提供服务,整体对外零中断;升级过程不依赖人工切换,也不引入额外负载均衡组件故障点。** 这不是单纯在一台机器上执行 USR2/WINCH 信号操作,而是需要结合高可用架构协同控制。
确认双机热备架构类型
先明确你用的是哪种热备机制,它直接决定升级路径:
- Keepalived + VIP 模式:主备节点共用一个虚拟 IP(VIP),主节点持有 VIP 并运行 Nginx;备节点待命,不响应流量。这是最常见场景。
- DNS 轮询 + 健康检查:两台 Nginx 均对外提供真实 IP,前端 DNS 或 LVS 层做轮询或权重分发,并依赖健康探测(如 HTTP 状态码)自动摘除异常节点。
- 独立负载均衡器(如 HAProxy、F5)后端双 Nginx:LB 主动管理后端节点状态,支持主动下线/上线节点。
不同架构下,“平滑”所指的“不中断”发生在不同层面——有的靠 VIP 切换时间极短,有的靠 LB 摘流+优雅关闭,有的靠 DNS TTL 缓存控制。必须按实际架构设计步骤。
Keepalived VIP 架构下的标准升级流程
这是最典型也最容易出问题的场景。关键原则是:先让备机接管 VIP,再升级原主机;升级完成后,再切回并升级备机。
- 检查当前主备状态:
ip addr show看哪台有 VIP;systemctl status keepalived确认服务正常。 - 手动触发主备切换(避免自动抢占干扰):
– 在当前主机(即将升级的主节点)执行:sudo systemctl stop keepalived(或killall keepalived);
– 等待约 2~3 秒,确认 VIP 已漂移到备机(ip addr show验证),且业务访问正常(curl 测试)。 - 在原主机上执行 Nginx 平滑升级:
– 备份旧二进制与 conf;
– 编译新版本(./configure参数务必与旧版一致,用nginx -V查);
–make后替换/usr/local/nginx/sbin/nginx;
– 发送USR2→WINCH→QUIT完成本机 Nginx 进程更新;
–nginx -t && nginx -s reload验证配置与运行。 - 恢复 Keepalived 并验证:
– 启动原主机 Keepalived:systemctl start keepalived;
– 它会以备机身份加入集群,不抢 VIP;
– 此时两节点均为新版本,但 VIP 仍在原备机(现主机)上。 - 对另一节点重复相同升级流程(此时它成为“待升级主节点”),完成全量升级。
无 VIP 的双节点直连架构(DNS/LB 后端)
这类架构更灵活,升级节奏由你掌控,重点在于“可控摘流”和“进程级优雅退出”:
- 提前设置健康检查端点(如
location /health { return 200 "OK"; }),确保上游能准确识别节点状态。 - 升级前,先通过 LB 管理界面或 API 将待升级节点标记为“维护中”,或临时修改 DNS TTL 至 30 秒并指向单节点(需业务可接受短暂单点风险)。
- 确认上游已停止向该节点转发新请求(查看 access.log 是否还有新连接)。
- 执行标准平滑升级:
– 替换二进制文件;
–kill -USR2 $(cat logs/nginx.pid)启动新 master;
–kill -WINCH $(cat logs/nginx.pid)让旧 worker 处理完存量连接;
– 观察ps aux | grep nginx,确认旧 worker 数量归零后再kill -QUIT旧 master。 - 升级完成后,恢复节点健康状态,等待 LB/DNS 自动将其重新纳入服务池。
关键注意事项与避坑点
这些细节常被忽略,却极易导致升级失败或服务抖动:
-
编译参数必须严格一致:特别是模块(
--with-http_ssl_module)、用户组(--user=nginx --group=nginx)、路径(--prefix)。漏掉任一模块,启动即报错。 -
不要跳过
nginx -t:新二进制 + 旧配置可能因语法变更(如 1.25+ 废弃某些指令)而失败,必须在替换后、发信号前验证。 - 禁止在升级中重启 Keepalived 或 Nginx 服务:systemctl restart nginx 会 kill 所有进程,破坏平滑性;restart keepalived 可能引发 VIP 抢占冲突。
-
日志与监控要就位:升级前后对比
nginx -V输出、worker 进程数、error.log 中是否有 module not found 或 deprecated warning。 -
回滚方案必须预演:备份的
nginx.bak和conf.bak要验证可还原;Keepalived 配置若含 version 相关参数(如 vrrp_script 超时逻辑),也需同步兼容。











