nginx自身无热备能力,必须依赖keepalived+vip实现双机热备;核心是共用vip、priority区分主备、vrrp_script健康检查、virtual_router_id等网络参数严格一致,并配合后端无状态设计与主动/被动健康检查,确保秒级故障切换与防脑裂。

Keepalived 双机热备:核心配置要点
在两台装有 Nginx 的服务器上同时部署 Keepalived,它们共用一个对外服务的虚拟 IP(VIP),客户端只访问这个 VIP,不感知后端是哪台机器在工作。
-
主备角色靠 priority 区分:主节点设
priority 101,备节点设priority 99;数值越大优先级越高,主节点默认持有 VIP -
健康检查靠 vrrp_script 实现:每 2 秒执行脚本检查 Nginx 进程是否存活,如
killall -0 nginx && exit 0 || exit 1;一旦失败,主节点自动降权,触发 VIP 切换 -
网络层关键参数必须一致:两台机器的
virtual_router_id(建议设为唯一整数,如 51)、网卡名(如ens160)、子网掩码、组播地址都要严格相同,否则 VRRP 协议无法协商
上游服务层也要配合热备逻辑
Nginx 热备只是入口层冗余,后端服务也得跟上,否则 VIP 切过去还是挂:
-
upstream 中启用 backup 标识备用节点:比如某台后端临时维护,可加
server 192.168.1.103:8080 backup;,仅当其他节点全不可用时才启用 - 所有后端实例必须无状态或共享状态:登录态存 Redis 集群(非单点),会话不能绑定某台机器;数据库主从自动切换,写操作始终打向主库,读流量可分发到从库
-
健康检查要主动+被动结合:每个
server行配max_fails=3 fail_timeout=30s,再配合nginx_upstream_check_module做 HTTP 探活(如 GET /health),响应非 200 就剔除
切换验证与日常保障
热备不是配完就完事,得验证它真能用:
-
手动模拟主节点宕机:执行
systemctl stop keepalived或直接关机,观察备节点日志是否出现VRRP_Instance(VI_1) Entering MASTER STATE,并确认 VIP 已接管 -
用 arping 或 tcpdump 抓包验证 ARP 切换:客户端侧执行
arping -c 2 -I eth0 192.168.1.200(VIP),看 MAC 地址是否已变为备机网卡地址 - 避免脑裂(Split-Brain):确保两台 Keepalived 之间网络互通且延迟稳定;禁用防火墙对 VRRP 协议(协议号 112)的拦截;生产环境建议用专用心跳线或跨交换机三层互通











