主备关系由keepalived通过vrrp协议和健康检查动态管理,nginx仅为无状态反向代理;角色由state、priority及vrrp_script检测结果共同决定,需组合检测进程与服务可用性,防范脑裂并确保配置同步与可观测性。

主备关系不是靠 Nginx 自己维持的,而是由 Keepalived 通过 VRRP 协议和健康检查机制动态管理的。Nginx 在这个架构里是无状态的反向代理,只管转发;谁持有 VIP、谁对外提供服务,全由 Keepalived 决定。
Keepalived 控制主备身份的核心参数
主备角色由 keepalived.conf 中 vrrp_instance 的以下三项共同决定:
- state:显式声明节点初始状态(MASTER 或 BACKUP),仅作启动参考
- priority:数值越大越优先成为 MASTER,主节点通常设为 100,备节点设为 90
- vrrp_script 检测结果影响有效优先级:例如 chk_nginx 脚本失败时,会按 weight 值扣减 priority(如 -20),导致实际值低于备机,触发切换
健康检查必须覆盖进程与服务可用性
单纯检测 Keepalived 心跳或网络连通性不够,容易出现“假活”——Nginx 进程在但无法响应请求。推荐组合检测:
- 用
killall -0 nginx确认主进程存活 - 用
curl -s --head http://127.0.0.1/nginx_status验证 Nginx 能正常返回 200 OK - 脚本执行间隔建议设为 2 秒,weight 建议设为 ±20,避免抖动误切
防脑裂与切换稳定性设置
网络分区或瞬时抖动可能让主备同时认为对方失效,造成 VIP 双占。关键防护措施包括:
- 启用 preempt_delay(如设为 30),让恢复后的主节点延迟接管,避开抖动窗口
- 确保两节点 virtual_router_id 完全一致,且不与其他集群冲突
- 若局域网组播不可靠(如云环境),改用 unicast_peer 显式指定对端 IP,避免选主混乱
配置同步与可观测性保障
主备行为一致的前提是配置一致,重点注意:
- Nginx 配置文件内容需完全相同(除日志路径等本地路径外)
- Keepalived 的 global_defs 中 router_id 必须唯一,但其他全局项(如 notification_email)可不同
- 开放
/nginx_status接口并限制访问(如仅限 127.0.0.1),供健康检查调用 - 所有日志中固定记录
$remote_addr和$upstream_addr,便于故障时快速定位流量走向











