必须启用mod_proxy_hcheck模块并配置proxyhcexpr表达式,结合hcmethod=get和hcuri探测路径,才能实现基于响应体内容的健康检查;需apache≥2.4.49、模块已加载、表达式名与hcexpr参数严格一致。

Apache 代理本身不解析后端响应体,默认只看 HTTP 状态码(2xx/3xx 就认为健康)。要实现基于响应内容的故障检测,必须启用 mod_proxy_hcheck 模块,并配合 ProxyHCExpr 自定义表达式,从 JSON、文本等实际返回内容中提取关键字做判断。
启用并确认模块可用性
这是前提,缺一不可:
- Apache 版本 ≥ 2.4.49(低版本不支持
%{hc resp body}变量) - 运行
httpd -M | grep proxy_hcheck,有输出表示模块已加载 - 若无输出,需在配置中显式添加:
LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
定义响应体关键字匹配表达式
用 ProxyHCExpr 写正则逻辑,直接检查响应正文内容。例如:
- 匹配
{"status":"ok"}(忽略空格和换行):ProxyHCExpr ok {%{hc resp body} =~ /"status"\s*:\s*"ok"/} - 匹配
{"ready":true}且排除维护状态:ProxyHCExpr ready {%{hc resp body} =~ /"ready"\s*:\s*true/ && %{hc resp body} !~ /"maintenance"/} - 匹配纯文本
"ALIVE"(不区分大小写):ProxyHCExpr alive {%{hc resp body} =~ (?i)ALIVE}
⚠️ 表达式名(如 ok、ready)后续要在 BalancerMember 中通过 hcexpr= 引用,大小写必须完全一致。
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
绑定到后端节点并指定探测路径
在 <proxy balancer:></proxy> 块内配置,确保参数成对生效:
ProxyHCExpr ok {%{hc resp body} =~ /"status"\s*:\s*"ok"/}
<proxy balancer:>
BalancerMember http://10.0.1.20:8080 \
hcexpr=ok \
hcmethod=GET \
hcuri=/actuator/health \
hcinterval=8 \
hcfail=3 \
hcpass=2
</proxy>
ProxyPass "/api" "balancer://api/api"
ProxyPassReverse "/api" "balancer://api/api"
关键点:
-
hcuri必须是后端真实暴露的接口(如 Spring Boot 的/actuator/health),不能是 Apache 自身路径 -
hcmethod=GET(不是 HEAD)——因为 HEAD 不带响应体,无法用于内容匹配 -
hcinterval=8表示每 8 秒发一次请求;太短易压垮后端,太长延迟发现故障 -
hcfail=3和hcpass=2避免瞬时抖动误判
调试与验证不能只看管理页
/balancer-manager 显示的是最终 UP/DOWN 状态,看不出某次检查为何失败。真正线索在日志里:
- 开启详细日志:
LogLevel proxy_hcheck:trace8 - 在
error_log中搜索hcheck或hc resp body,可看到每次探测的原始响应体和匹配结果 - 若表达式始终不生效,先确认
hcuri是否返回了预期内容(用curl直接调用验证)
不复杂但容易忽略










