Nginx双机热备高可用需VIP漂移、服务级健康检查、配置强一致性三者联动;主备IP同子网、VIP动态绑定、防火墙放行80/443及VRRP(112)、SELinux设permissive;Nginx配置逐字一致;Keepalived靠state、priority、virtual_router_id三参数协同判定主备;须用nginx_check.sh脚本实现HTTP级健康检查防假活。

在 Nginx 双机热备环境中实现应用集群高可用,核心不是堆机器,而是让“服务能力”真正可接管、可验证、不假活。主备切换必须基于 VIP 漂移 + 服务级健康检查 + 配置强一致性三者联动,缺一不可。
网络与系统基础必须对齐
主备服务器不是独立个体,而是一个逻辑整体:
- 使用同一子网内的静态 IP(如主 192.168.1.10、备 192.168.1.11),VIP(如 192.168.1.100)不配置在任何物理网卡上,由 Keepalived 动态绑定
- 关闭 firewalld 或显式放行 TCP 80/443 端口 + VRRP 协议(IP 协议号 112)
- SELinux 设为 permissive 模式(setenforce 0),避免拦截 VRRP 组播通信
- 用 ip a 确认实际网卡名(如 ens33 或 eth0),Keepalived 配置中 interface 字段必须严格匹配
Nginx 配置必须逐字相同
切换的不是 IP,是服务能力。若主备返回不同响应,用户立刻感知异常:
- /etc/nginx/nginx.conf 中的 listen 端口、server_name、root 路径、proxy_pass 目标必须完全一致
- 若作反向代理,upstream 列表、max_fails、fail_timeout 等参数也需同步
- 建议静态页加标识便于验证:主节点写 WEB01 - MASTER,备节点写 WEB02 - BACKUP
- 每次修改后执行 nginx -t 校验语法,再 systemctl reload nginx
Keepalived 主备角色靠三要素联动生效
VRRP 不靠名字判断主备,而依赖三个硬性参数共同作用:
- state:主节点设为 MASTER,备节点为 BACKUP
- priority:主节点优先级更高(如 100),备节点略低(如 90),数值必须不同且在同一组内唯一
- virtual_router_id:主备必须完全一致(如 51),它是 VRRP 组的“身份证”,错一个就无法形成心跳组
必须加 Nginx 健康检查脚本防假死
默认 Keepalived 只检测网络连通性。如果 Nginx 进程僵死但仍在,VIP 不会漂移——这就是“假活”:
- 新建脚本 /etc/keepalived/nginx_check.sh,内容为:
curl -s --head http://127.0.0.1 | grep "200 OK" > /dev/null - 在 keepalived.conf 的 vrrp_script 块中调用它,设置 interval 2(每 2 秒检查)、weight -5(失败则降低本节点优先级)
- 将该脚本绑定到 vrrp_instance 中,确保服务级状态真正驱动 VIP 漂移


















