nginx+keepalived高可用双机热备通过vip漂移实现秒级故障切换:主备需同子网静态ip、一致nginx配置与keepalived的state/priority/virtual_router_id参数,并配置nginx健康检查脚本触发真实故障转移。

构建 Nginx + Keepalived 的高可用双机热备,本质是用轻量级协议解决单点入口风险:让两台 Nginx 服务器共享一个对外服务的虚拟 IP(VIP),主节点承载流量,备节点实时监听;一旦主节点失联或 Nginx 崩溃,VIP 秒级漂移到备节点,客户端无感知切换。
网络与系统基础必须对齐
两台服务器不是简单装上软件就能协同工作,底层一致性是前提:
- 使用同一子网内的静态 IP(如主 192.168.201.131,备 192.168.201.129),VIP 192.168.201.130 不配置在任何物理网卡上,由 Keepalived 动态绑定
- 关闭 firewalld 或放行 TCP 80/443 端口 + VRRP 协议(IP 协议号 112)
- SELinux 设为 permissive 模式(
setenforce 0),避免拦截 VRRP 组播通信 - 确保
ip a查到的网卡名(如ens33或eth0)在 Keepalived 配置中准确填写,否则 VIP 无法绑定
Nginx 服务内容必须完全一致
切换不是只换 IP,而是换“服务能力”。若主备 Nginx 返回不同页面、跳转不同后端、甚至返回 502,用户就会感知异常:
- 配置文件路径、
listen端口、server_name、root或proxy_pass目标必须逐字相同 - 静态页建议加标识便于验证(主节点写
WEB01 - MASTER,备节点写WEB02 - BACKUP) - 若作反向代理,
upstream列表、权重、健康检查参数(如max_fails、fail_timeout)也需同步
Keepalived 主备角色要靠三要素区分
VRRP 不靠“名字”判断主备,而靠三个硬性参数联动生效:
-
state:主节点设为
MASTER,备节点为BACKUP -
priority:主节点优先级更高(如
100),备节点略低(如90),数值必须不同且在同一组内唯一 -
virtual_router_id:主备必须完全一致(如
51),它是 VRRP 组的“身份证”,错一个就无法形成心跳组
必须加 Nginx 健康检查脚本
默认 Keepalived 只检测网络层连通性。如果 Nginx 进程挂了但系统还活着,VIP 仍留在故障节点——这就是“假活”。真实场景中需引入进程级探测:
- 写一个
/etc/keepalived/nginx_check.sh脚本,用killall -0 nginx或curl -s --head http://localhost | grep "200 OK"判断服务状态 - 在
vrrp_script块中调用它,设置interval 2(每 2 秒检查)、weight -2(失败则降低本节点优先级) - 当主节点 Nginx 异常,其 priority 会跌至低于备节点,触发 VRRP 重选,VIP 自动漂移
不复杂但容易忽略。











