keepalived通过vip漂移与主动健康检查实现nginx高可用,非简单堆叠实例;vip绑定主节点,故障时秒级切换至备节点;结合curl健康检测、进程重启重试及vrrp_script联动,避免假存活;通过priority、vrrp_strict和单播通信防脑裂;再叠加nginx upstream容错,形成接入层到应用层的完整容错链。

Keepalived 通过虚拟 IP(VIP)漂移和主动健康检查,让 Nginx 集群在单点故障时仍能持续对外提供服务,不是靠“多开几台 Nginx”堆数量,而是靠机制保障业务不中断。
用 VIP 实现无感切换
Keepalived 在两台 Nginx 服务器上配置同一个虚拟 IP(如 192.168.1.100),这个 IP 只绑定在当前主节点的网卡上。客户端始终访问这个 VIP,完全不知道背后是哪台物理机。当主 Nginx 宕机、网络断连或 Keepalived 进程退出,备节点在几秒内检测不到心跳,立刻将 VIP 绑定到自己网卡并接管流量——整个过程对用户透明,没有连接重置或报错提示。
不只是看进程,还要验服务
单纯判断 nginx 进程是否存在不够可靠。实际部署中必须配合自定义检测脚本,例如:
- 用 curl 访问本地 Nginx 的健康检查端点(如 /health),返回 200 才算真正可用
- 若失败,先尝试 systemctl restart nginx,再等 2 秒验证;仍失败才触发 VIP 切换
- 这个逻辑写进 vrrp_script 段,和 VRRP 状态联动,避免“进程活着但 502 堆积”的假高可用
优先级与脑裂防护
主备角色不是静态设定,而是由 priority 和 vrrp_strict 等参数动态维持:
- 主节点 priority 设为 100,备节点设为 90,数值高者胜出
- vrrp_strict 启用后,会校验组播地址、接口名、认证方式等细节,防止配置错位导致双主
- 结合 unicast_peer 或单播通信(尤其跨子网时),规避组播不可达引发的误切换
和 Nginx 自身容错形成分层防御
Keepalived 解决的是最前端入口的单点问题,而 Nginx 本身也承担后端容错:
- upstream 中配置 max_fails=3 fail_timeout=30s,自动屏蔽异常 Tomcat
- proxy_next_upstream http_502 http_504 timeout,把失败请求转给下一台后端
- 两者叠加:前端 VIP 切换 + 后端节点剔除,构成从接入层到应用层的完整容错链











