mod_proxy_hcheck 本身不直接实现自动上下线,仅探测健康状态并反馈给 mod_proxy_balancer;真正启用/禁用节点由 balancer 模块根据探测结果动态调整。
apache 的 mod_proxy_hcheck 本身不直接实现“自动上下线”,它只负责探测后端节点健康状态,并把结果反馈给 mod_proxy_balancer;真正的节点启用/禁用(即“上线/下线”)由 balancer 模块根据健康检查结果动态调整。要达成“自动上下线”效果,需完成健康探测 + 状态判定 + 负载均衡联动 + 配置热更新支持四层协同。
必须启用并正确配置 mod_proxy_hcheck
该模块从 Apache 2.4.33 引入,但默认不加载,且 2.4.47+ 才稳定支持响应体解析等关键能力:
- 检查是否已加载:
httpd -M | grep proxy_hcheck
- 若无输出,手动加载(路径需与
httpd -V | grep SERVER_CONFIG_FILE一致):LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
⚠️ 注意:.so 后缀不可省略;路径中 modules/ 是相对于 ServerRoot 的,例如 Ubuntu 通常为 /usr/lib/apache2/modules/。
健康检查必须绑定到 balancer:// 场景
mod_proxy_hcheck 不是后台服务,它只在 ProxyPass 指向 balancer:// 时,对 BalancerMember 生效:
<proxy>
BalancerMember http://10.0.1.10:8080 \
hcmethod=GET hcuri=/healthz \
hcinterval=5 hcfails=3 hcpasses=2 \
hcexpr=healthy
</proxy>
ProxyPass "/api" "balancer://myapp/"
-
hcmethod和hcuri必须指向后端真实暴露的轻量健康端点(如/health-fast),避免触发业务逻辑; -
hcinterval=5表示每 5 秒探测一次,太短易压垮后端,太长延迟故障发现; -
hcfails=3:连续 3 次失败才标记为 Down; -
hcpasses=2:连续 2 次成功才恢复为 Up,防止抖动误判。
用 ProxyHCExpr 自定义健康逻辑,避免“假活”
默认仅看 HTTP 状态码(2xx/3xx 即视为健康),但很多后端返回 200 或 202,实际已卡死(如异步接口、线程池满)。必须用 ProxyHCExpr 结合响应内容判断:
ProxyHCExpr healthy { \
%{hc resp status} == 200 && \
hc('body') =~ /"status"\s*:\s*"ok"/ && \
%{hc resp header X-Health} == "true" \
}
-
hc('body')需配合hctemplate启用(见下); - 若用旧版 Apache(
ProxyHCExpr healthy %{hc resp header X-Health} == "true"
再在 BalancerMember 中引用:
BalancerMember http://... hcexpr=healthy
启用 hctemplate 支持响应体解析(关键步骤)
mod_proxy_hcheck 默认不抓响应体,必须显式声明模板才能用 hc('body'):
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
# 定义一个模板,告诉 Apache 只提取响应体(不解析 JSON,仅原始字符串) hctemplate default body
放在全局或 <proxy></proxy> 块内均可。若后端返回压缩内容(gzip),还需加:
hctemplate default body decompress
否则 hc('body') 为空,表达式永远不匹配,节点永不恢复。
验证自动上下线是否生效
最可靠方式是访问 /balancer-manager(需启用 mod_manager 并授权):
- “Status”列显示
Down且 “Failed” 计数持续增长 →hcfails已触发; - “Succ” 列连续增加、“Failed” 归零 →
hcpasses正在累积; - 若 “Succ” 卡住不动 → 检查
hcexpr是否匹配失败,或hctemplate是否缺失。
日志中出现 AH03278: Health check failed for ... 或 AH03279: Health check passed 也是有效线索。
不复杂但容易忽略










