apache mod_proxy_balancer可通过后端暴露的/health/metrics接口及proxyhcexpr表达式实现基于cpu、内存等指标的动态健康检查,结合hcmethod、hcexpr、loadfactor等配置支持软性降级与权重调整。
apache mod_proxy_balancer 本身不支持直接读取后端 cpu、内存等系统级指标,但可以通过「暴露指标接口 + 自定义健康检查表达式」的方式,实现基于业务或系统状态的动态评估。关键不是让 apache 去采集指标,而是让它能解析后端主动提供的、可量化的健康信号。
让后端提供标准化健康接口
每个后端节点需暴露一个轻量 HTTP 接口(如 /health/metrics),返回结构化数据,例如:
{"cpu_idle": 68.2, "mem_free_mb": 1240, "load_avg": 1.3, "status": "ok"}
该接口应响应快(建议 /proc/stat 或使用 Micrometer/Actuator)。Apache 不负责采集,只负责消费。
在 Apache 中定义健康检查表达式
使用 ProxyHCExpr 解析响应内容,构建可判断的逻辑。例如:
-
ProxyHCExpr cpu_ok {%{hc('body').json.cpu_idle} > 30}—— CPU 空闲率高于 30% 才认为合格 -
ProxyHCExpr mem_ok {%{hc('body').json.mem_free_mb} > 500}—— 可用内存大于 500MB -
ProxyHCExpr healthy { %{cpu_ok} && %{mem_ok} && %{hc('status') == 200} }—— 多条件组合
注意:hc('body') 要求启用 mod_proxy_hcheck,且响应必须是合法 JSON;hc('status') 获取 HTTP 状态码。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
将表达式绑定到后端节点
在 BalancerMember 行中启用主动探测,并引用上述表达式:
BalancerMember http://192.168.1.10:8080 \ hcmethod=GET \ hcuri=/health/metrics \ hcexpr=healthy \ hcinterval=10 \ hctimeout=3 \ retry=60
含义:每 10 秒发起一次 GET 请求,3 秒超时;若表达式求值为 false,节点被标记为 ERR 并暂停分发;60 秒后自动重试。多个节点可配置不同 hcinterval 或 hctimeout 以适配其响应特性。
配合权重实现软性降级
仅靠上下线不够精细。可结合 status=+H(热备)与动态 loadfactor 调整:
- 健康良好时设
loadfactor=5 - 检测到 CPU 空闲率低于 20%,通过外部脚本临时改写配置为
loadfactor=1 status=+H,再触发平滑重载(apachectl graceful) - 更推荐方式:用 Consul 或 etcd 统一管理节点元数据,Apache 配置文件由模板引擎(如 confd)自动生成并热重载
这种模式下,健康评估仍是“离散决策”,但权重变化可反映“程度差异”,比简单剔除更平滑。









