Apache不主动探测后端是否挂掉,故障转移依赖retry=60实现失败后60秒静默隔离与自动重试、timeout=5控制单次请求超时、hcmethod+hcuri+hcexpr进行应用层健康检查验证真实可用性、status=+H配置热备节点兜底。

Apache 本身不主动探测后端是否“挂掉”,它的故障转移(Failover)依赖被动响应 + 配置策略组合实现。要让 Apache 在后端失联时自动剔除、跳过、并尝试恢复,关键不是靠“心跳”,而是用好 retry、timeout、健康检查表达式(hcexpr)和热备节点(status=+H)这四类机制。
用 retry + timeout 实现基础自动隔离与静默恢复
这是最轻量、无需额外模块的方案,适用于所有 Apache 2.4 版本:
- retry=60:节点请求失败后,60 秒内不再向它转发新请求;超时后自动重试一次,成功即重新纳入调度,失败则继续隔离
- timeout=5:单次代理请求等待后端响应的上限为 5 秒,避免线程卡死或级联超时
- 注意:
retry不是“每 60 秒探测一次”,而是“失败后静默 60 秒”。如果后端进程僵死但 TCP 连接未断,Apache 仍会持续发请求并超时——这时必须配合健康接口才可靠
用 hcmethod + hcuri + hcexpr 做真实应用层健康检查
仅靠连接通断远远不够。生产环境必须验证后端服务是否真正就绪:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- hcmethod=GET 或 HEAD:指定探测方式,推荐 GET(兼容性更好),HEAD 更轻量但部分框架不支持
-
hcuri="/health":指向后端暴露的真实健康端点(如 Spring Boot Actuator 的
/actuator/health) -
hcexpr:用表达式校验响应内容,例如:
expr=%{REQUEST_STATUS} == 200 && %{RESPONSE_HEADERS} =~ /X-App-Status: ready/
这样能识别“端口通但应用卡在启动中”或“数据库连不上导致健康检查返回 200 但状态非 ready”的场景 - 务必关闭重定向:确保
/health不跳转(302),否则 HEAD 探测会失败
配置热备节点(Hot Standby)实现手动 Failover 分流
当所有主节点都被标记为失效时,可启用备用服务器承接流量,常用于灾备或滚动发布:
- 用 status=+H 标记某节点为热备(Hot standby),默认不参与负载,只在其他节点全部不可用时启用
- 热备节点也应配置
retry和timeout,防止它自己也出问题却无法被感知 - 示例:
BalancerMember http://192.168.1.99:8080 route=backup status=+H retry=60 timeout=5
必须同步启用的模块与安全前提
缺一不可,否则配置无效或存在风险:
- 确认已加载:
mod_proxy、mod_proxy_http、mod_proxy_balancer、mod_ssl(如需 HTTPS)、mod_status(balancer-manager 管理页需要) - 禁用
ProxyRequests On,只允许反向代理,杜绝开放代理漏洞 - balancer-manager 路径(如
/balancer-manager)必须限制访问来源(如仅允内网 IP),不可暴露在公网 - 所有机房节点使用统一证书与配置,通过 Ansible 或 GitOps 同步,避免配置漂移导致容灾失效










