双机热备核心在于故障切换的无声无感,需分层健康检查、主备职责隔离、实时可验证同步及可控切换流程。

双机热备不是“多一台机器”,而是让故障切换变得无声无感。关键不在冗余数量,而在切换是否快、准、稳——主备之间不抢活、不误判、不丢请求。
Keepalived 健康检查必须分层设计
单一 ping 或端口探测极易误判:网络抖动可能触发 VIP 漂移,而 Nginx 进程明明还在处理请求。应组合使用:
- 四层 TCP 探测(快速发现进程级僵死)
- 七层 HTTP 探测(访问 /health 端点,验证配置加载与上游连通性)
- 本地状态校验(例如检查 nginx.pid 是否存在、worker 进程数是否达标)
三项全部失败才触发切换,避免“假故障”导致的非必要漂移。
主备角色需严格隔离职责
两台 Nginx 服务器不能只是“一模一样的副本”。建议明确分工:
- 主节点承担全部流量 + 实时日志写入 + 配置热重载执行
- 备节点只做健康监听 + 定期同步配置与证书 + 保持 worker 进程预热(如用 curl 触发一次空请求)
这样既避免主备争抢资源,又确保备机真正 ready,而非冷启动后才加载配置。
数据与状态必须实时同步且可验证
Proxy Manager 或自定义 upstream 列表、SSL 证书、限流计数器等若不同步,切过去就出错。同步不能只靠 rsync:
- 用 inotify 监控 /data/nginx/conf.d/ 和 /etc/ssl/ 目录变更,触发增量同步
- 同步后自动执行 nginx -t 校验语法,并记录校验结果到本地状态文件
- Keepalived 的 check script 必须读取该状态文件,仅当“同步完成+校验通过”才认为备机健康
故障转移过程要可控、可追溯
切换不是“一刀切”,而是有节奏的过渡:
- VIP 漂移前,主节点主动关闭 accept(),拒绝新连接(可通过 setsockopt(SO_ACCEPTFILTER) 或临时 rewrite 所有新请求至 maintenance 页面)
- Keepalived 的 notify_master / notify_backup 脚本中,加入日志打点与告警通知(如飞书/钉钉),包含切换原因、时间、前后 IP
- 所有 Nginx access log 中增加 $upstream_addr 字段,便于事后分析哪台实际处理了请求
不复杂但容易忽略


















