Apache本身不主动探测后端节点,必须启用mod_proxy_hcheck(2.4.33+)并配置hcmethod、hcuri、hcinterval等参数实现主动探测,结合hcfailures、hcpass、retry及failonstatus等策略,才能自动隔离与恢复故障节点。

Apache 本身不主动探测后端节点是否存活,但通过 mod_proxy_balancer 搭配 mod_proxy_hcheck(2.4.33+)和合理策略配置,可以实现对失效节点的自动隔离——关键在于“主动探测 + 失效计数 + 冷却恢复”三者协同,而非依赖请求失败后的被动标记。
启用主动健康检查(必须步骤)
默认情况下,mod_proxy_balancer 只做静态轮询,不会发任何探测请求。要真正实现自动隔离,必须启用健康检查模块并为每个后端明确配置:
- 确认已启用模块:
a2enmod proxy_hcheck(Apache 2.4.33 及以上) - 在
BalancerMember行中添加探测参数,例如:BalancerMember http://10.0.1.5:8080 hcmethod=HEAD hcuri="/health" hcinterval=15 hcfailures=2 hctimeout=3 -
hcuri必须指向后端真实暴露的健康端点(如 Spring Boot 的/actuator/health),不能是 Apache 自身路径 - 用
ProxyHCExpr自定义判定逻辑,例如只接受 2xx 响应:ProxyHCExpr ok {%{REQUEST_STATUS} =~ /^[2]/},避免因重定向或服务降级返回 3xx/4xx 导致误判
设置失效与恢复的边界策略
节点不是“一错就踢”,也不是“一好就上”。需防止网络抖动引发频繁上下线,同时保证故障能被及时识别:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 为每个
BalancerMember显式设置timeout=5 retry=60:
— 请求超时 5 秒即记为一次失败;
— 进入 DOWN 状态后,至少等待 60 秒才尝试首次恢复探测 - 恢复不是“检查一次 OK 就上线”,而是需满足「连续成功 + 冷却期」:
若hcinterval=15且hcfailures=2,则至少需等待 30 秒才允许重新探测 - 避免
retry设为 0(永不恢复)或过小(如 5 秒),否则易造成节点反复震荡
配合被动容错增强鲁棒性
仅靠健康检查还不够。真实业务请求失败也应参与隔离决策,形成双重保障:
- 在
BalancerMember中添加failonstatus=500,502,503,504,让网关层响应直接触发失败计数 - 对核心路径(如支付、订单)单独建立
balancer://core,配置更敏感的hcfailures=1和更短的hcinterval=5 - 在
ProxyPass中明确timeout=3 retry=10,防止长尾请求阻塞线程池,间接影响健康检查调度
人工干预作为兜底与运维入口
自动机制无法覆盖所有场景(如计划内维护、灰度验证),需保留快速人工控制能力:
- 启用
/balancer-manager页面(需配合mod_status),仅限内网 IP 访问 - 页面中可实时查看节点状态、响应时间、失败次数,并一键执行 “Mark as Down” 或 “Mark as Up”
- 临时摘除节点时,改写
status=D(强制 DOWN)或status=-H(禁用健康检查),再执行systemctl reload apache2即刻生效

















