nginx双机热备核心是vip漂移、服务级健康检查与配置一致性三者协同:主备需同子网静态ip、keepalived的state/priority/virtual_router_id严格匹配,配置nginx_check.sh脚本每2秒探测http状态,确保nginx假死时vip秒级漂移,且nginx配置逐字相同。

Nginx 双机热备架构下的服务冗余,核心不是“多装一台”,而是让两台机器在能力、状态和响应上真正互为备份。关键在于VIP 漂移 + 服务级健康检查 + 配置一致性三者协同生效。
确保 VIP 能正确漂移
虚拟 IP(VIP)是客户端唯一访问入口,它必须能在主节点失效时自动绑定到备节点:
- 主备服务器需在同一子网,使用静态 IP(如 192.168.1.10 和 192.168.1.11),VIP(如 192.168.1.100)不配置在任何物理网卡上,由 Keepalived 动态管理
- Keepalived 配置中 interface 必须与真实网卡名一致(用
ip a确认,如ens33或eth0),否则 VIP 无法绑定 -
virtual_router_id 主备必须完全相同(如
51),它是 VRRP 组的唯一标识;state 分别设为MASTER和BACKUP;priority 主节点更高(如100),备节点略低(如90)
防止 Nginx 假活导致切换失败
网络通 ≠ 服务可用。若 Nginx 进程僵死但 Keepalived 仍运行,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的track_script块下,确保检测失败后 priority 跌至低于备节点,触发真实切换
保持 Nginx 配置完全一致
切换不是换 IP,而是换服务能力。配置差异会导致用户看到不同页面、跳转错误后端甚至返回 502:
-
/etc/nginx/nginx.conf中的 listen 端口、server_name、root 路径、proxy_pass 目标 必须逐字相同 - 若作反向代理,upstream 列表、max_fails、fail_timeout、backup 标识 等参数也需同步
- 建议在首页加可识别标识(如
WEB01 - MASTER/WEB02 - BACKUP),便于快速验证当前生效节点 - 每次修改后执行
nginx -t校验语法,再systemctl reload nginx
基础环境必须对齐
底层不一致,上层再精细也白搭:
- 关闭 firewalld 或放行 TCP 80/443 和 VRRP 协议(IP 协议号 112)
- SELinux 设为
permissive(setenforce 0),避免拦截 VRRP 组播通信 - 主备系统版本、Nginx 版本、Keepalived 版本尽量一致,减少兼容性风险











