keepalived通过vrrp协议管理浮动vip实现nginx高可用,确保vip始终绑定健康节点;需同网段、二层互通、放行vrrp/icmp,并配置主备优先级与nginx进程健康检查联动。

在 Nginx 高可用架构中,Keepalived 的作用不是“绑定”Nginx 的虚拟 IP,而是通过 VRRP 协议在多台服务器间自动管理一个浮动 VIP(Virtual IP),确保该 IP 始终落在健康运行 Nginx 的主机上。Nginx 本身不感知 VIP,它只监听本机 IP(包括 VIP,因为 VIP 实际已配置在系统网络栈中)。关键在于:Keepalived 负责 VIP 的抢占与故障转移,Nginx 负责响应 VIP 上的请求。
一、基础前提:VIP 必须能被正确路由
Keepalived 管理的 VIP 需要满足网络可达性要求:
- VIP 通常使用和服务器物理网卡同网段的未被占用的 IP(如 192.168.1.100),不能与任何真实主机 IP 冲突;
- 两台 Nginx 服务器需在同一二层网络(如同一交换机下),否则 VRRP 广播包无法互通,Keepalived 无法协商主备;
- 若部署在云平台(如阿里云、AWS),默认不支持 VRRP 或禁止免费 ARP,需改用云厂商提供的高可用方案(如 SLB + ECS)或启用“VRRP 模式兼容”开关(部分云厂商支持);
- 确保服务器关闭了防火墙对 VRRP 协议(协议号 112)和 ICMP(用于健康检查)的拦截:
iptables -I INPUT -p vrrp -j ACCEPT。
二、Keepalived 配置主备角色与 VIP
在主节点(priority 较高)和备节点(priority 较低)分别配置 /etc/keepalived/keepalived.conf,核心是定义 VRRP 实例和虚拟 IP:
主节点示例(priority 100):
vrrp_instance VI_1 {
state MASTER
interface eth0 # 实际网卡名,用 ip a 查看
virtual_router_id 51 # 同一集群必须一致,1–255
priority 100 # 主节点数值更高
advert_int 1 # VRRP 通告间隔(秒)
authentication {
auth_type PASS
auth_pass 1111 # 主备认证密码,需一致
}
virtual_ipaddress {
192.168.1.100/24 dev eth0 label eth0:1 # VIP 及子网掩码、绑定网卡别名
}
}
备节点示例(priority 90):
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90 # 小于主节点
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24 dev eth0 label eth0:1
}
}
配置后启动服务:systemctl enable keepalived && systemctl start keepalived。可通过 ip a 查看 VIP 是否出现在主节点的网卡上。
三、让 Keepalived 智能感知 Nginx 状态
仅靠 Keepalived 自身心跳不够——如果 Nginx 进程崩溃但 Keepalived 还在运行,VIP 不会自动漂移。需添加自定义健康检查脚本:
新建检测脚本 /etc/keepalived/check_nginx.sh:
#!/bin/bash
if ! pgrep -f "nginx: master process" &> /dev/null; then
systemctl stop keepalived
fi
赋予执行权限:chmod +x /etc/keepalived/check_nginx.sh
在 keepalived.conf 的 vrrp_instance 块内加入:
track_script {
chk_nginx
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -5
}
这样,当 Nginx 挂掉时,脚本会停止 keepalived,触发 VIP 切换到备机。
四、Nginx 配置无需特殊改动,但要注意监听
Nginx 默认监听 0.0.0.0:80 即可响应 VIP 流量,无需显式绑定 VIP。验证方式:
- 在任一客户端访问
http://192.168.1.100,应返回 Nginx 页面; - 手动停掉主节点的 Nginx(或 kill master 进程),观察约 2–3 秒后 VIP 是否自动出现在备节点
ip a输出中; - 再次访问 VIP,确认服务仍可用。
整个过程不复杂但容易忽略网络层限制和健康检查联动。只要 VIP 可达、VRRP 通、Nginx 状态可探测,Keepalived 就能可靠接管流量入口。











