双机热备核心在于“热”与“备”的轻量协同,需统一配置+版本锁定、极简Keepalived、全自动化启切、前置日志与可观测性。

双机热备不是堆机器,而是用最少配置达成故障自动接管。关键不在“双”,而在“热”和“备”的协同逻辑是否轻量、可验证、易回滚。
统一配置 + 版本锁定
两台 Nginx 节点必须运行完全一致的配置和二进制版本,否则切换后行为不可预期。建议:
- 所有配置(nginx.conf、upstream、server 块)集中托管在 Git 仓库,通过 Ansible 或 rsync 同步到两节点,禁止手工修改
- 编译安装时固定参数(如
--prefix=/etc/nginx、--with-http_ssl_module),打包成 RPM/DEB 或容器镜像,避免环境差异 - 启用
server_tokens off;和ssl_protocols TLSv1.2 TLSv1.3;等安全项,在模板中预置,避免上线后补漏
Keepalived 配置极简化
Keepalived 不是越复杂越可靠,多数生产环境只需单 VIP + 主备模式。精简要点:
- 只定义一个
vrrp_instance,virtual_router_id、interface、auth_pass 全局一致,state 和 priority 分开设置(MASTER: priority 100,BACKUP: priority 90) - 去掉冗余的 email 通知、smtp 配置——告警交给 Prometheus+Alertmanager 统一处理更可靠
- 健康检查脚本控制在 10 行以内:检测 nginx 进程 + 端口连通性即可,例如
curl -sf http://127.0.0.1/health || exit 1
启动与切换全自动化
运维动作应能一键执行、幂等生效:
- Nginx 启动前强制校验:
nginx -t && nginx -s reload,失败则中断流程,不依赖人工判断 - Keepalived 启动后加检查:
ip addr show | grep "192.168.x.100",确认 VIP 是否已绑定 - 模拟主节点宕机只需执行
systemctl stop keepalived,5 秒内备机应自动接管,无需重启服务或手动干预
日志与可观测性前置集成
出问题时,第一反应不是登录机器查日志,而是看大盘:
- 两节点 access_log 和 error_log 统一打到同一台日志服务器(如 Loki),用 label 标记
node=nginx-01/node=nginx-02 - 暴露
/health接口返回{"status":"ok","role":"MASTER","uptime":12345},供监控系统轮询 - 在 Grafana 中建一个「VIP 活跃节点」面板,实时显示当前持有 VIP 的机器名,比 ping 更直接


















