mod_proxy_hcheck 是 Apache 2.4.47+ 引入的健康检查模块,不能直接用;需手动加载模块、绑定 ProxyPass、配置 hcinterval/hcfails 等参数,并常需 ProxyHCExpr 自定义判断逻辑。

mod_proxy_hcheck 是什么,能不能直接用
不能直接用。mod_proxy_hcheck 从 Apache 2.4.47 才正式引入,且默认不启用;低于这个版本的 Apache(比如常见的 2.4.41、2.4.46)压根没有这个模块。即使版本达标,也得手动加载,否则 ProxyHCTemplate、HCheck 这类指令会报 Invalid command 'ProxyHCTemplate' 错误。
检查方法很简单:
httpd -M | grep hcheck
没输出就说明没加载。加载方式是在配置中加一行:
LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
注意路径要和你的 httpd -V | grep SERVER_CONFIG_FILE 实际模块路径一致,常见坑是写成 mod_proxy_hcheck.c 或漏掉 .so 后缀。
健康检查配置必须和 ProxyPass 配合使用
mod_proxy_hcheck 不是独立运行的“后台探针”,它只在 proxy 场景下生效,且必须绑定到某个 ProxyPass 对应的 balancer:// 或具体 ProxyPass 目标上。单独写 HCheck 指令不会触发任何检查。
典型用法是先定义一个健康检查模板,再在 balancer 成员里引用:
<Proxy "balancer://myapp"><br> BalancerMember http://10.0.1.10:8080 route=1 hcinterval=5 hcfaillovertime=30 hcpasses=2 hcfails=3<br> ProxySet lbmethod=byrequests<br></Proxy><br><br>ProxyPass "/api" "balancer://myapp/"<br>ProxyPassReverse "/api" "balancer://myapp/"
关键点:
-
hcinterval=5表示每 5 秒发一次健康检查请求(不是连接探测,是真实 HTTP 请求) -
hcfails=3连续 3 次失败才标记为 down,避免瞬时抖动误判 -
hcpasses=2连续 2 次成功才恢复为 up,防止过早切回 - 健康检查请求默认是
GET /,可配合ProxyHCExpr自定义判断逻辑(比如检查响应体是否含"status":"ok")
自定义健康检查响应判断容易漏掉 ProxyHCExpr
默认行为只是看 HTTP 状态码是不是 2xx/3xx,很多后端服务健康接口返回 200 但 body 是 {"alive":false},这时候必须用 ProxyHCExpr 写表达式过滤。不配这个,等于白启 mod_proxy_hcheck。
例如后端 /healthz 返回 JSON,要求 status 字段为 "ok":
ProxyHCExpr ok {%{hc resp body} =~ /"status"\s*:\s*"ok"/}<br><Proxy "balancer://myapp"><br> BalancerMember http://10.0.1.10:8080 hcexpr=ok hcinterval=3 path=/healthz<br></Proxy>
注意:hc resp body 只在 Apache 2.4.49+ 支持;旧版只能靠状态码或响应头(如 %{hc resp header X-Health} == "true")。另外 path=/healthz 一定要写,否则仍发 GET /,可能触发非预期路由。
日志和调试信息藏得深,出问题要开 debug 级别
健康检查失败默认不记日志,你看到后端被踢了但不知道为什么。必须把日志级别调到 debug,并关注 proxy_hcheck 子模块:
LogLevel alert proxy_hcheck:debug
这时会在 error log 里看到类似:
[proxy_hcheck:debug] [pid 12345] hc_worker: member http://10.0.1.10:8080 failed HC request (status=503, body="Service Unavailable")
常见干扰项:
- 后端防火墙或 SELinux 拦截了 Apache 主进程发起的 outbound 请求(不是浏览器来的请求)
- 后端设置了
Connection: close或超时太短,导致 Apache 的健康检查连接被提前断开 -
hcinterval设得太小(如 1 秒),并发检查太多拖垮后端,反而引发雪崩
真正起作用的健康检查,往往需要反复调低间隔、观察日志、比对后端 access log 中的请求来源 IP(确认是 Apache 本机而非其他监控工具),才能稳住。

















