nginx 本身不支持节点间心跳同步,高可用依赖外部工具如 keepalived 实现节点存活感知与 vip 漂移;keepalived 基于 vrrp 发送组播心跳包,配合 vrrp_script 检测 nginx 进程状态,实现自动故障切换。

用 Keepalived 实现最主流的高可用心跳
Keepalived 是目前生产环境首选,基于 VRRP 协议工作,轻量、稳定、延迟低:
- MASTER 节点周期性(默认每秒)向组播地址 224.0.0.18 发送 VRRP 心跳包(UDP),不依赖 HTTP 或应用层探测
- BACKUP 节点监听该组播,若连续 3 秒收不到(由
advert_int 1和dead_interval 3控制),立即升为 MASTER 并接管虚拟 IP(VIP) - 配合
vrrp_script检测 Nginx 进程是否存活(例如用pgrep nginx),进程挂了就降权,触发切换 - 无需共享存储、无需修改 Nginx 配置,只要两台机器网络互通、时间误差
Heartbeat 方案适合小规模或旧系统迁移
Heartbeat 更重、配置更复杂,现在已较少用于新项目,但仍有场景适用:
- 它通过点对点 UDP/TCP 心跳检测节点状态,支持自定义脚本判断服务健康(如 curl 检查 /health 端点)
- 需额外配置 共享存储(如 NFS) 来统一静态资源(HTML、图片等),否则文件不同步会导致用户看到不一致内容
- 依赖
ha.cf、authkeys、haresources三个核心配置文件,角色和资源绑定需手动指定,出错不易排查 - 适合对 VIP 切换时间不敏感、且已有 NFS 基础设施的小流量业务
别踩这些常见坑
很多故障不是配置写错,而是环境细节没对齐:
-
防火墙未放行组播:CentOS/RHEL 默认拦截 224.0.0.18,要加规则
iptables -I INPUT -d 224.0.0.18 -j ACCEPT - 时间不同步:Keepalived 对时钟敏感,误差超 1 秒可能引发脑裂;建议用 chronyd 并指向同一 NTP 源
-
网卡名不一致:配置里写的
interface eth0在新系统可能是ens33或enp0s3,务必用ip link确认 - 忽略 Nginx 启动依赖:Keepalived 的检查脚本如果只查进程不验证端口监听,可能误判(比如 nginx 启动但卡在 bind 失败)











