Keepalived通过VRRP协议管理VIP实现Nginx双机热备秒级切换,要求主备服务器网络环境一致、Nginx配置完全相同、Keepalived的state/priority/virtual_router_id三参数严格匹配,并配置Nginx健康检查脚本防假死。

Keepalived 在 Nginx 双机热备中不直接处理请求,而是通过 VRRP 协议管理一个共享的虚拟 IP(VIP),让主备两台 Nginx 服务器对外表现为“一台”,实现秒级故障切换。
网络与基础环境必须严格对齐
主备协同不是装上软件就生效,底层一致性是前提:
- 两台服务器必须在同一子网,使用静态 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),避免拦截组播通信
- 用 ip a 确认真实网卡名(如 ens33),Keepalived 配置中 interface 字段必须完全匹配,否则 VIP 无法生效
Nginx 配置必须逐字一致
切换的是 IP,更是服务能力。配置差异会导致用户看到不同页面、跳转异常或返回 502:
- /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 的 track_script 中,确保检测失败时 priority 跌至低于备节点,触发自动切换


















