用Keepalived配合Nginx实现主备高可用,核心是通过VIP漂移保障服务连续性:主节点健康时VIP绑定其网卡,宕机或Nginx失效时秒级切至备节点;需配置一致Nginx、内网互通、VRRP放行、SELinux调优,并通过/healthz端点与自研检测脚本实现真实HTTP健康检查。

用 Keepalived 配合 Nginx 实现主备高可用,核心是让两台 Nginx 服务器共享一个虚拟 IP(VIP),由 Keepalived 控制 VIP 只绑定在健康节点上。主节点正常时对外提供服务;一旦它宕机或 Nginx 失效,VIP 秒级漂移到备节点,业务无感知中断。
准备两台已部署 Nginx 的服务器
确保两台机器都已正确安装并运行 Nginx,监听端口(如 80/443)可用,且配置一致(例如反向代理规则、SSL 证书等)。网络需满足:
- 两台服务器能互相 ping 通,且处于同一局域网段
- 预留一个未被使用的内网 IP 作为 VIP(如 192.168.1.100)
- 关闭防火墙或放行 VRRP 组播(协议号 112)和健康检查端口
- SELinux 建议临时禁用(
setenforce 0)或配置对应策略
配置 Nginx 健康检查端点
Keepalived 不能只靠进程是否存在来判断 Nginx 是否可用,必须验证其 HTTP 服务能力。在 nginx.conf 的 server 块中添加:
location /healthz {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
保存后执行 nginx -t && nginx -s reload,再用 curl http://127.0.0.1/healthz 确认返回 healthy。
安装 Keepalived 并编写智能检测脚本
在两台服务器上都安装 Keepalived:
- CentOS/RHEL:
yum install -y keepalived - Ubuntu/Debian:
apt install -y keepalived
创建健康检查脚本 /etc/keepalived/check_nginx.sh:
#!/bin/bash
if ! curl -f -s --connect-timeout 3 http://127.0.0.1/healthz > /dev/null 2>&1; then
systemctl restart nginx
sleep 2
if ! curl -f -s --connect-timeout 3 http://127.0.0.1/healthz > /dev/null 2>&1; then
systemctl stop keepalived
exit 1
fi
fi
赋予执行权限:chmod +x /etc/keepalived/check_nginx.sh。该脚本会主动探测、尝试恢复,失败才触发 VIP 漂移,避免误切。
配置 Keepalived 主备角色
编辑 /etc/keepalived/keepalived.conf:
主节点(192.168.1.10)配置:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
track_script {
check_nginx
}
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -20
}
备节点(192.168.1.11)配置:仅修改三处 —— state BACKUP、priority 90、interface 名称(如为 ens33 则同步替换)。
启动服务:systemctl enable --now keepalived,然后执行 ip a 查看 VIP 是否出现在主节点网卡上。


















