Keepalived通过VRRP协议实现VIP自动漂移:主节点故障时,备节点秒级接管VIP并广播ARP更新,确保Nginx高可用;依赖健康检查脚本、优先级配置、防火墙放行VRRP组播及内核参数ip_nonlocal_bind=1。

在 Nginx 高可用架构中,Keepalived 通过 VRRP 协议实现主备节点间的浮动 IP(Virtual IP)自动漂移,确保当主 Nginx 节点故障时,VIP 快速切换到备用节点,用户无感知。核心在于 Keepalived 管理 VIP,并配合健康检查判断 Nginx 服务状态。
一、基础环境准备
需至少两台服务器(例如 node1 和 node2),均安装 Nginx 和 Keepalived,并确保:
- 系统防火墙放行 VRRP 组播(协议号 112,目的地址 224.0.0.18),或临时关闭 firewalld/iptables
- SELinux 设为 permissive 或 disabled(避免干扰 VIP 绑定)
- 两节点时间同步(建议配置 chronyd)
- 内核参数开启非本地 IP 绑定:net.ipv4.ip_nonlocal_bind = 1(写入 /etc/sysctl.conf 并 sysctl -p)
二、Nginx 健康检查脚本(关键)
Keepalived 不能直接感知 Nginx 进程是否真正提供服务,需用自定义脚本检测其工作状态。推荐检查端口 + HTTP 响应:
创建 /etc/keepalived/check_nginx.sh:
#!/bin/bash
if ! kill -0 $(cat /var/run/nginx.pid) 2>/dev/null; then
systemctl start nginx &>/dev/null
sleep 2
if ! kill -0 $(cat /var/run/nginx.pid) 2>/dev/null; then
exit 1
fi
fi
# 可选:再加一层 HTTP 检查(如 curl -I http://127.0.0.1 | head -1 | grep "200 OK")
exit 0
赋予执行权限:chmod +x /etc/keepalived/check_nginx.sh,并确保该脚本在 Keepalived 配置中被正确调用。
三、Keepalived 主备配置(以 node1 为主)
主节点(node1)/etc/keepalived/keepalived.conf:
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -5
fall 3
rise 2
}
<p>vrrp_instance VI_1 {
state MASTER
interface eth0 # 实际网卡名,如 ens33、enp0s3
virtual_router_id 51 # 同一集群必须一致,1–255
priority 100 # 主节点 > 备节点(如备设为 90)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 # 密码需一致,明文传输但仅局域网内
}
virtual_ipaddress {
192.168.1.100/24 # 浮动 IP,掩码需匹配实际网段
}
track_script {
chk_nginx
}
}
</p>
备节点(node2)配置仅需修改:state BACKUP、priority 90,其余保持一致。
四、验证与常见问题
启动服务并观察:
- 分别启动:systemctl start keepalived(先启备,再启主)
- 主节点执行 ip a 应看到 VIP 绑定在 eth0:1;备节点不应出现
- 手动停主节点 Nginx:systemctl stop nginx,约 6 秒内(3×2s)VIP 自动漂移到备节点
- 访问 http://192.168.1.100 始终能响应,即高可用生效
常见失败原因:VRRP 包被防火墙拦截、virtual_router_id 不一致、脚本无执行权限、nginx.pid 路径错误、网卡名写错、非本地绑定未开启。











