Apache本身不主动探测后端健康状态;必须启用mod_proxy_hcheck模块,配置hcmethod、hcuri、hcinterval、hcfail、hcpass及ProxyHCExpr表达式,结合retry参数实现探测、判定与静默恢复的逻辑闭环。

Apache 本身不主动探测后端节点健康状态,mod_proxy_balancer 默认只做静态轮询。要实现“自动探测 + 静默恢复”,必须显式启用健康检查模块并合理配置参数组合——不是加几个字段就行,关键在逻辑闭环。
必须启用 mod_proxy_hcheck 并配置基础探测
仅靠 mod_proxy_balancer 无法主动探测。从 Apache 2.4.33 起,需加载 mod_proxy_hcheck 模块(Debian/Ubuntu 执行 a2enmod proxy_hcheck,RHEL/CentOS 确保 LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so 已启用)。
在 块中为每个后端明确设置:
-
hcmethod=HEAD或hcmethod=GET:推荐 HEAD,轻量且不触发业务逻辑;避免对高频接口用 GET -
hcuri=/health:必须指向后端真实暴露的健康端点(如 Spring Boot 的/actuator/health),不能是 Apache 自身路径 -
hcinterval=10:每 10 秒探测一次;太短易受抖动影响,太长则故障发现滞后 -
hcfail=3:连续 3 次失败才标记为 DOWN;设为 1 容易误剔,设为 5 可能延迟隔离 -
hcpass=2:连续 2 次成功才恢复为 UP;避免刚返回 200 就转发流量,而业务接口尚未就绪
用 ProxyHCExpr 定义真正有效的健康判定
默认情况下,Apache 只把 2xx/3xx 当作健康响应,但很多后端在过载时仍返回 200(比如 JSON 中 "status":"DOWN")。仅靠状态码无法识别这类“假活”节点。
必须配合自定义表达式:
ProxyHCExpr ok {%{REQUEST_STATUS} == 200 && %{RESPONSE_BODY} =~ /"status"\s*:\s*"UP"/}- 该表达式同时校验 HTTP 状态码和响应体内容,确保不只是连得上,还要服务真就绪
- 将该表达式绑定到成员:
BalancerMember http://node1 hcexpr=ok
静默恢复依赖 retry + 冷却期双约束
节点被标记为 DOWN 后,并不会“检查一次 OK 就立刻上线”。它必须同时满足两个条件:
- 健康检查连续成功达到
hcpass次(如 2 次) - 经过至少
hcinterval × hcfail的冷却时间(如 10×3 = 30 秒)
这意味着即使后端秒级恢复,Apache 也会等待冷却期结束才发起首次恢复探测。若想加快节奏,可调低 hcinterval 和 hcfail,但需同步调整 retry 参数防止反复震荡:
-
retry=30:节点进入 DOWN 后,30 秒内不参与任何请求分发(这是被动恢复窗口) -
retry应略大于hcinterval × hcfail,否则可能刚恢复探测又因超时被踢回 DOWN
调试不能只看 balancer-manager 页面
/balancer-manager 显示的是最终状态(OK/DOWN),不反映探测过程。常见问题如“明明返回了 200,节点还是 DOWN”,往往是因为表达式没匹配、防火墙拦截了探测请求,或后端健康端点响应超时。
开启详细日志定位问题:
- 在 Apache 配置中加入:
LogLevel proxy_hcheck:trace8 - 查
error.log,搜索hcheck关键字,确认是否发出请求、收到什么响应头与响应体 - 用
curl -I http://node-ip:port/health在负载均衡服务器本地测试,排除网络或权限问题











