nginx主从双机热备的故障切换由keepalived控制,典型时间为1–3秒;需将advert_int设为1、fail_count/rise_count设为2,配合curl检查/healthz接口、调优arp参数及关闭干扰防火墙规则,压测可稳定在2秒内。

主从双机热备中,Nginx 本身不负责切换逻辑,真正的故障响应时间由 Keepalived 控制,典型范围是 1–3 秒。这个时间不是固定值,取决于 Keepalived 的检测配置、网络收敛速度以及系统内核参数是否调优。
Keepalived 检测周期直接影响切换快慢
默认 VRRP 检测较保守(如 3 秒 × 3 次失败才切换),无法满足秒级要求。要压缩到 1–2 秒内,需主动调整:
- 将
advert_int设为 1,即每秒发送一次 VRRP 通告 -
fail_count和rise_count均设为 2,连续两次检测失败即触发降级 - 避免仅依赖 ping 或端口通断,改用
vrrp_script调用本地 curl 检查真实业务接口(如/healthz或/nginx_status)
健康检查必须反映真实服务就绪状态
单纯判断 Nginx 进程存活不够,需确认它能正常处理请求:
- 暴露独立的
location /healthz { return 200; },不经过 upstream、不限流、不鉴权 - 若代理后端应用,建议在 Nginx 内置轻量健康检查服务,或启用
ngx_http_upstream_check_module - 重启/重载时使用
nginx -s reload配合worker_shutdown_timeout 3s,确保旧连接处理完再退出,防止切流瞬间丢请求
网络与系统层延迟常被忽略
即使 Keepalived 配置正确,ARP 缓存、防火墙规则或 DNS 缓存仍可能拉长客户端感知时间:
- 关闭干扰 VIP 的 INPUT 防火墙规则(尤其 DROP 未知 VIP 的策略)
- 两台机器执行:
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore和echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce - 内网调用建议直连 VIP;公网场景需配合 Anycast 或云厂商 LB,因 DNS TTL 天然存在缓存延迟
实际压测中,从主节点模拟宕机(如 kill -9 nginx)到备机完全接管并响应新请求,多数可稳定控制在 2 秒以内。关键不在组件多先进,而在检测逻辑是否贴近业务真实可用性。











