mod_proxy_hcheck 通过主动健康探测动态调整 balancer:// 集群中后端节点状态,实现外网请求自动绕过故障内网服务;需配合 proxypass、balancermember 参数、proxyhcexpr 表达式、hcfails/hcpasses、proxypassreverse 及会话保持等配置,并通过日志和 balancer-manager 验证状态同步效果。
apache mod_proxy_hcheck 本身不直接“同步内外网服务状态”,它只在 apache 作为反向代理时,对已配置的后端节点(即内网服务)执行主动健康探测,并根据结果动态调整其在 balancer:// 集群中的可用状态。所谓“内外网状态同步”,实质是:**让外网访问者感知不到故障节点,请求自动绕过失活的内网服务——这种感知一致性,就是同步效果的体现。**
必须绑定 balancer 场景才能触发探测
该模块不是独立运行的守护进程,也不扫描任意 IP。它只在满足以下条件时才工作:
-
ProxyPass 指向 balancer:// 协议,例如
ProxyPass /api balancer://myapp/ -
每个 BalancerMember 显式声明健康检查参数,如:
BalancerMember http://192.168.1.20:8080 hcmethod=GET hcuri=/healthz hcinterval=10 - 未使用
hcstatus=disable或status=+H被禁用的成员不会被探测
探测逻辑决定“状态是否真实反映后端”
默认仅看 HTTP 状态码(2xx/3xx 视为健康),但生产环境需自定义判断,避免误判:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 用
ProxyHCExpr写表达式,例如检查响应体是否含"status":"UP":ProxyHCExpr ok {%{hc_resp_body} =~ /"status":"UP"/} - 将该表达式绑定到集群:
<proxy><br> ProxySet hcexpr=ok<br></proxy>
- 配合
hcfails=3(连续失败3次下线)和hcpasses=2(连续成功2次上线),避免抖动
外网无感切换依赖 ProxyPassReverse 和会话保持
健康状态变化后,Apache 自动从负载池中剔除或恢复节点,但要让外网用户“无感”,还需配套配置:
-
ProxyPassReverse 必须成对配置,否则后端返回的
Location: /login会被浏览器跳转到内网地址,暴露拓扑 - 若需会话粘性(如老系统依赖 session ID),加
stickysession=ROUTEID并确保后端在响应头中写入Set-Cookie: ROUTEID=...; path=/ - 通过
ProxyPreserveHost On和X-Forwarded-*头透传,让后端日志、限流、鉴权能正确识别原始请求来源
验证状态是否真正同步
不能只看配置是否生效,要确认探测行为与状态变更真实发生:
- 开启 trace8 日志:
LogLevel proxy_hcheck:trace8,观察每 5–10 秒是否有HCheck: probing...和status=DOWN → UP记录 - 手动模拟后端宕机(如停掉一个 Tomcat),等待
hcfails × hcinterval后,用curl -I http://your-domain/api/test验证是否不再路由到该节点 - 检查
balancer-manager页面(需启用mod_status和对应权限),实时查看各成员的State和Health列










