Nginx本身不内置集群节点间心跳同步机制,需依赖Keepalived等外部工具实现:Keepalived通过VRRP协议周期性发送组播心跳包(UDP 224.0.0.18),MASTER节点广播、BACKUP节点监听,连续丢失3秒心跳即触发VIP漂移,配合nginx进程检测脚本实现服务级高可用。

Nginx 本身不内置集群节点间的心跳同步机制,它是一个无状态的反向代理或 Web 服务器。所谓“Nginx 集群节点之间的实时心跳同步”,实际是指通过外部高可用组件(如 Keepalived 或 Heartbeat)在多台 Nginx 机器之间建立心跳检测与故障转移能力,确保任一节点宕机时流量能自动切到健康节点——这不是 Nginx 自身同步配置,而是由外围工具保障的“服务级心跳”。
核心目标不是让 Nginx 实时同步状态,而是让整个反向代理层具备感知节点存活性、自动接管 VIP 的能力。
✅ 心跳检测的本质:谁在发?谁在收?怎么判故障?
心跳不是 Nginx 进程自己发的,而是由 Keepalived(主流)或 Heartbeat(较老)这类 HA 工具周期性执行的:
- Keepalived 默认使用 VRRP 协议广播/组播心跳包(UDP 224.0.0.18),每秒 1 次(可调)
- 每个节点运行一个 Keepalived 实例,分 MASTER / BACKUP 角色
- MASTER 节点持续发送 VRRP 广播;BACKUP 节点监听,若连续丢失多个包(如
advert_int 1+dead_interval 3→ 3 秒无心跳即切换),就触发 VIP 接管
⚠️ 注意:这不是应用层 HTTP 心跳(比如
curl -I http://nginx/health),而是网络层协议级心跳,延迟低、开销小、更可靠。
✅ 实现步骤(以 Keepalived + 双 Nginx 为例)
1. 确保基础环境一致
- 两台服务器(如
192.168.4.136和192.168.4.137)都已安装并启动 Nginx - 关闭防火墙或放行 VRRP 组播(
iptables -I INPUT -d 224.0.0.18 -j ACCEPT) - 时间同步(
chronyd或ntpd,误差建议 < 1s,避免脑裂)
2. 安装并配置 Keepalived
在两台机器上安装:
yum install keepalived -y
主节点(MASTER)配置 /etc/keepalived/keepalived.conf:
global_defs {
router_id NGINX_MASTER
}
vrrp_script chk_nginx {
script "/usr/bin/pgrep nginx > /dev/null || systemctl start nginx"
interval 2
weight 2
}
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.4.100/24 dev eth0 label eth0:1
}
track_script {
chk_nginx
}
}备节点(BACKUP)只需改两项:
state BACKUP-
priority 90(必须低于主)
3. 添加 Nginx 存活性检查脚本(可选但推荐)
上面的 chk_nginx 脚本会定期检查 Nginx 进程,挂了就拉起;若仍不可用,Keepalived 会主动降权或停止自身,触发 VIP 切换。
你也可以换成 HTTP 健康检查:
script "curl -f http://127.0.0.1/healthz || exit 1"
前提是 Nginx 配置了该路径返回 200。
4. 启动服务
systemctl enable keepalived systemctl start keepalived
验证 VIP 是否生效:
ip addr | grep 192.168.4.100
✅ 补充说明:为什么不用 Nginx 自己做心跳?
- Nginx 是事件驱动模型,没有原生多节点协调模块
-
upstream中的max_fails/fail_timeout是对后端服务(如 Tomcat)的探测,不是对同集群其他 Nginx 节点的心跳 - 若真需要跨 Nginx 节点共享状态(如限流计数、缓存一致性),需引入 Redis、etcd 或专用服务发现组件(Consul + registrator),但这属于「状态同步」,不属于「心跳检测」
✅ 故障切换效果验证
- 手动停掉主节点的 Nginx:
nginx -s stop→ Keepalived 检测失败 → 尝试拉起 → 若失败则触发 VIP 迁移 - 主节点 Keepalived 进程被 kill → 备节点约 3 秒内接管 VIP,客户端请求无感知中断(TCP 连接会重连,HTTP 层基本无感)
- 主节点恢复后,根据
nopreempt或preempt_delay设置决定是否抢回 VIP(生产建议关闭抢占,避免抖动)
不复杂但容易忽略


















