Nginx主备高可用需与Keepalived协同优化:配置严格同步、双层级健康检查、漂移平滑承接、监控绑定VIP。

在主备高可用架构中,Nginx 的性能优化不能只盯着单节点配置,必须和 Keepalived 的 VIP 漂移机制协同设计。否则容易出现“VIP 切过去了,但新主节点扛不住流量”或“健康检查滞后,故障节点还在收请求”等问题。核心思路是:让调度能力随 VIP 一起就绪,且切换过程对上游无感。
保持两节点配置完全一致,避免漂移后行为突变
主备节点的 Nginx 配置(尤其是 upstream、proxy_* 参数、超时设置)必须严格同步,包括:
- upstream 中所有 server 的 weight、max_fails、fail_timeout、backup 状态完全相同
- proxy_buffering、proxy_buffers、proxy_busy_buffers_size 等缓冲参数一致,防止备机因缓冲不足引发响应延迟
- keepalive 连接池配置(如 keepalive 32;)需启用并数值统一,确保漂移后复用连接的能力不降级
- 所有 location 块中的 proxy_set_header、rewrite 规则、限流配置均需镜像,避免 VIP 切换后 Header 丢失或重写逻辑错乱
健康检查必须覆盖 Nginx 自身 + 后端服务双层级
仅靠 Keepalived 的 VRRP 心跳不够——它只判断网络连通性,无法感知 Nginx 进程卡死或 upstream 全部不可用。需叠加两层检查:
- Nginx 进程级检查:Keepalived 的 vrrp_script 调用自定义脚本,例如检测 nginx -t 是否通过、ps aux | grep nginx 是否存活、curl -I http://127.0.0.1/health 返回 200
- 后端服务级检查:在 upstream 中配置 proxy_next_upstream error timeout http_500–504,并搭配 max_fails=3 fail_timeout=30s;若使用 nginx_upstream_check_module,可主动探测 /health 接口
- 两项检查结果共同决定是否触发 VIP 漂移,避免“Nginx 活着但后端全挂”时仍对外提供无效服务
漂移期间平滑承接流量,减少连接中断
VIP 漂移本身是秒级操作,但客户端 TCP 连接可能因 FIN/RST 不完整而重连失败。可通过以下方式缓解:
- 主节点 Keepalived 配置 notify_stop 脚本,在降级前执行 nginx -s stop 并等待活跃连接自然关闭(配合 proxy_read_timeout 和 keepalive_timeout 设置)
- 备节点 notify_master 脚本中加入 sleep 1 && nginx -s reload,确保 Nginx 配置热加载完成后再对外响应
- 客户端侧建议开启 TCP keepalive(SO_KEEPALIVE),并缩短 idle 时间(如 60s),加速异常连接清理
- 在 upstream 中设置 least_conn 或加权轮询而非纯轮询,避免漂移后新请求集中打到某台后端导致雪崩
监控与日志需绑定 VIP,不依赖物理 IP
所有监控指标(QPS、5xx 率、upstream 响应时间)、访问日志、错误日志都应以 VIP 为标识,而非实际机器 IP:
- log_format 中包含 $server_addr 或 $upstream_addr 时,要确认其输出的是 VIP 绑定的监听地址,而非回环或内网地址
- Prometheus 抓取 targets 应配置为 http://VIP:9113/metrics,而不是固定指向 master_ip
- 告警规则中匹配 host 标签时,统一用 VIP 域名或标签,避免切换后监控断点或误报



















