apache通过mod_proxy_hcheck主动探测后端并动态调整节点状态,验证需模拟故障、开启proxy_hcheck:trace8日志查看探测执行与down标记、访问/server-status?auto确认state变化、抓包或记录%balancer_worker_route验证流量绕过,最后测试恢复后自动回流。
apache 本身不自动感知后端宕机,必须靠 mod_proxy_hcheck 主动探测并根据响应结果动态调整节点状态。测试其响应是否有效,关键不是“等宕机再看”,而是模拟故障、验证探测逻辑是否触发、节点是否被正确标记为 down,并在恢复后自动回流。
准备可复现的故障环境
真实宕机难控制、不可逆,推荐用可控方式模拟:
- 临时停掉一个后端服务(如
systemctl stop myapp),确认其端口已关闭(ss -tln | grep :8080) - 或保留服务运行,但让健康接口返回异常:修改后端
/healthz返回 503、空响应、或 JSON 中"status": "DOWN" - 避免仅改 HTTP 状态码——要测试内容级判断,就得让响应体/头不符合
ProxyHCExpr表达式定义的规则
确认健康检查正在运行并捕获日志
没有日志就等于没执行。必须开启 trace 级别日志:
- 在 Apache 配置中添加:
LogLevel proxy_hcheck:trace8 - 重启 httpd:
sudo systemctl reload httpd - 立刻查 error_log:
sudo tail -f /var/log/httpd/error_log | grep hcheck - 应看到类似
hcheck: running health check on https://10.0.1.10:8443/和hcheck: result for ... is DOWN的输出
实时查看节点状态变化
不能只信日志,要直接观察负载均衡器内部状态:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 确保已启用
mod_status并配置了ExtendedStatus On - 访问
http://your-apache/server-status?auto - 找到对应 balancer 段,检查各
BalancerMember的State字段:正常时为Ok,探测失败后应变为Down或Init(取决于失败次数是否达hcfail) - 若状态始终是
Init或不变,说明hcexpr名称拼错、模块未加载、或探测路径根本没被请求(比如hcuri写错)
验证流量是否真实绕过故障节点
日志和状态页只是“说它DOWN了”,最终要看请求是否真的不发过去:
- 用
curl -v http://your-apache/api/test多次发起请求(至少 5–10 次) - 同时在各后端机器上抓包:
sudo tcpdump -i any port 8080 -c 5 - 若只有一个后端持续收包、另一个完全无流量,说明隔离生效
- 也可在 Apache access_log 中加 %{BALANCER_WORKER_ROUTE}e 记录实际路由目标,直接确认分发行为
测试恢复流程是否自动
健康检查的价值不仅在于“踢出”,更在于“自动回流”:
- 恢复后端服务(或修复健康接口返回)
- 等待不超过
hcinterval × hcsuccess时间(例如hcinterval=5,hcsuccess=2→ 最多 10 秒) - 再次访问
/server-status?auto,确认 State 变回Ok - 重复 curl 测试,观察之前被跳过的节点是否重新收到请求










