Keepalived是Nginx双机热备的核心,基于VRRP协议实现VIP漂移与心跳检测;主节点发送心跳包,备节点监听,超时后自动接管VIP;需配置vrrp_script探测HTTP健康接口(如/health),并放行VRRP协议(IP号112)及相应端口。

在 Nginx 双机热备架构中,Nginx 本身不内置主备切换和心跳检测能力,必须借助外部机制实现高可用。常见方案是结合 Keepalived 实现 VIP 漂移 + 心跳检测,而 Nginx 仅作为被监控的服务组件。
Keepalived 是核心心跳与故障转移载体
Keepalived 通过 VRRP 协议在主备节点间周期性发送/接收心跳包(组播或单播),并基于健康检查结果决定 VIP 归属。它不依赖 Nginx 进程状态本身,而是通过主动探测(如端口连通性、HTTP 健康接口)判断服务是否可用。
- 主节点定期发送 VRRP 广播(默认每秒一次),备节点监听;若连续丢失若干次(
advert_int×authentication配置的失败阈值),触发角色切换 - Keepalived 可配置
vrrp_script脚本,例如检测curl -f http://127.0.0.1:80/health是否返回 200,失败则降低优先级,促使 VIP 切换 - 建议启用
notify_master/notify_backup脚本,在角色变更时优雅 reload 或 stop/start Nginx,避免请求中断
Nginx 需暴露可探测的健康端点
为支持 Keepalived 的主动健康检查,Nginx 应提供轻量、稳定、无副作用的健康接口。不推荐直接检查 80 端口 TCP 连通性(可能端口通但业务异常),应使用 HTTP 层探针。
- 在 Nginx 配置中添加一个 location,例如:
location /health { return 200 'OK\n'; add_header Content-Type text/plain; } - 该路径不应涉及后端转发、变量计算或日志写入,确保响应极快且恒定成功(除非 Nginx 完全卡死或进程退出)
- 避免使用需鉴权或依赖 upstream 的健康检查路径,防止误判;也不建议用
/status(需第三方模块)增加复杂度
网络与权限关键细节不可忽略
心跳检测失效常源于底层网络或权限配置问题,而非逻辑错误。
- 主备节点需处于同一二层网络(或路由器透传 VRRP 组播),否则 VRRP 包无法送达;如跨网段,改用单播模式并在
vrrp_instance中显式指定对端 IP - 防火墙需放行 VRRP 协议(IP 协议号 112)及健康检查端口(如 80 或自定义端口),CentOS 7+ 默认 firewalld 需执行:
firewall-cmd --add-protocol=vrrp --permanent - Keepalived 启动需 root 权限(绑定 VIP 和 raw socket),普通用户无法完成地址漂移;systemd service 文件中不能设置
DropPrivileges
验证与日志排查要点
部署后务必模拟故障验证流程,并关注 Keepalived 日志定位问题。
- 查看 Keepalived 日志:
journalctl -u keepalived -f,重点关注Entering MASTER STATE/Leaving MASTER STATE及脚本执行结果 - 手动停掉主节点 Nginx,观察备节点是否在
preempt_delay(如有)后接管 VIP,并能正常响应curl http://VIP/health - 使用
tcpdump -i eth0 vrrp抓包确认心跳包收发是否正常;用ip addr show查看 VIP 是否出现在对应网卡


















