实现nginx与keepalived平滑联动需配置健康检查脚本并绑定至vrrp实例,通过weight -5触发vip漂移,统一selinux、防火墙(放行vrrp协议)、nginx配置及系统时间,最后验证kill nginx后vip是否自动切换并响应正常。

实现 Nginx 与 Keepalived 的平滑联动,关键不在“装上就跑”,而在于让 Keepalived 真正感知 Nginx 的运行状态,并在进程异常时及时触发 VIP 漂移——避免“Keepalived 还活着,Nginx 却挂了”的假高可用。
确保基础服务状态可被准确识别
Keepalived 默认只检测自身 VRRP 实例是否存活,不关心 Nginx 是否真能响应请求。必须引入主动健康检查机制:
- 编写轻量级检测脚本(如 /etc/keepalived/nginx_check.sh),用
curl -I http://127.0.0.1:80 -m 3 -f验证 HTTP 响应头,返回非 0 则判定失败 - 脚本需具备执行权限:
chmod +x /etc/keepalived/nginx_check.sh - 确保两台机器的脚本内容、路径、权限完全一致,否则备节点可能误判主节点健康状态
在 Keepalived 中正确绑定健康检查逻辑
仅配置 vrrp_script 不够,还需将其关联到具体 VRRP 实例,并设置合理的权重变化策略:
- 在
vrrp_instance VI_1块内添加track_script { chk_http_port },使 VIP 状态受脚本结果约束 -
weight -5是核心:当检测失败,当前节点优先级自动减 5;若主节点 priority=100,失败后降为 95,低于备节点的 90(或更高值),即可触发切换 - 配合
fall 2和rise 1,避免因网络抖动造成误切,兼顾响应速度与稳定性
统一环境与收敛差异点
联动失效常源于“看似一样、实则不同”的隐性偏差:
- 关闭 SELinux(
setenforce 0)并设为 disabled,防止其拦截 Keepalived 绑定 VIP 或执行脚本 - 防火墙必须放行 VRRP 协议(IP 协议号 112),不是端口——
firewall-cmd --add-protocol=vrrp --permanent,而非只开 80 端口 - 两台机器的 Nginx 配置文件(含
server_name、root、监听地址)、静态页内容、甚至系统时间(用chronyd或ntpdate同步)都应保持一致
验证联动是否真正生效
不能只测“停 Keepalived”,要模拟真实故障场景:
- 手动 kill nginx 进程:
kill -9 $(pgrep nginx),观察约 2–3 秒后 VIP 是否从主节点消失、出现在备节点(ip a | grep 192.168.x.x) - curl 访问 VIP,确认返回的是备节点页面(如 “WEB02 - BACKUP”)且响应正常
- 重启主节点 Nginx 后,观察是否自动抢回 VIP(取决于
preempt_delay设置,默认立即抢占)











