nginx双机热备无间断服务依赖keepalived+vrrp的vip漂移机制,而非nginx自身backup指令;主备节点通过virtual_router_id、advert_int、健康检查脚本及防火墙/selinux/时间同步等配置确保vip秒级可靠切换。

要实现 Nginx 双机热备环境下的无间断服务,核心不是靠 Nginx 自身的 backup 指令(那只是上游负载均衡层面的容错),而是依赖 Keepalived + VRRP 构建的虚拟 IP(VIP)漂移机制。客户端始终访问同一个 VIP,主节点故障时 VIP 秒级迁移至备用节点,Nginx 服务本身无需重连、DNS 不需刷新、连接不中断——这才是真正意义上的无间断。
确保 VIP 能快速、可靠地漂移
VIP 是无间断服务的“门牌号”,它的切换必须快且稳:
- 主节点配置 state MASTER,优先级设为 100;备节点配 state BACKUP,优先级设为 90(差值建议 ≥10,避免抖动)
- virtual_router_id 在主备间必须完全一致(如 51),否则 VRRP 组无法识别彼此
- advert_int 1 表示每秒发一次心跳,备节点超时(默认 3 秒)收不到即触发切换,整个过程通常在 2–4 秒内完成
- 网卡名(interface)务必与实际一致(用 ip addr 确认,常见为 eth0、ens33 或 enp0s3)
加入 Nginx 健康检查,杜绝“假活”
仅靠 Keepalived 心跳不够——如果 Nginx 进程崩溃但 Keepalived 还在运行,VIP 仍留在故障节点,用户请求将直接失败。必须用自定义脚本主动探测 Nginx 状态:
- 写一个简单检测脚本(如 /etc/keepalived/check_nginx.sh),用 curl -I http://127.0.0.1:80 判断返回码是否为 200
- 脚本权限设为可执行:chmod +x /etc/keepalived/check_nginx.sh
- 在 keepalived.conf 的 vrrp_instance 块中添加:
chk_nginx
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -20
}
这样,一旦 Nginx 不可用,脚本使当前节点优先级下降 20,立即触发 VIP 漂移。
网络与系统层关键配置
再好的逻辑也依赖底层稳定:
- 关闭或放行防火墙:VRRP 使用组播地址 224.0.0.18 和协议号 112,需允许通过(firewall-cmd --add-protocol=vrrp --permanent)
- 临时禁用 SELinux:setenforce 0;若需永久关闭,修改 /etc/selinux/config 中 SELINUX=disabled
- 两台服务器时间必须同步(用 chronyd 或 ntpd),时间偏差过大会干扰 VRRP 状态判断
- Nginx 配置保持完全一致(包括 root 路径、index 文件、SSL 证书位置等),避免 VIP 切换后页面或功能异常
验证与观察要点
上线前务必实测,关注三个关键现象:
- 主节点运行时,用 ip addr show 查看 VIP 是否绑定在其网卡上
- 手动停掉主节点 Nginx(systemctl stop nginx),2–4 秒内备节点应立刻获得 VIP,且 curl http://VIP 返回正常响应
- 主节点恢复 Nginx 后,观察 VIP 是否自动切回(取决于配置中是否启用 preempt,默认开启)











