Apache mod_proxy_balancer 通过主动健康检查(hcexpr/hcinterval)、失败状态码标记(failonstatus)、请求重试(maxattempts)和兜底维护页(ErrorDocument 503)实现故障节点自动隔离与流量平滑转移。
apache mod_proxy_balancer 本身不自动“修复”挂掉的节点,但能通过健康检查、故障隔离和请求重试机制,让流量绕过失效节点,避免用户直接看到 502/503 等错误。核心不是报错后怎么做,而是提前感知、快速屏蔽、平滑转移。
主动探测 + 自动标记 DOWN
仅靠连接超时不够,必须配置主动健康检查(hcexpr + hcinterval):
- 定义检查表达式,例如:
ProxyHCExpr ok200 {%{REQUEST_STATUS} == 200},只认 HTTP 200 为健康 - 每个
BalancerMember加上参数:hcexpr=ok200 hcinterval=10 hcuri="/health" timeout=3 retry=30
→ 每 10 秒发一次GET /health,连续 30 秒无 200 就标为 DOWN,恢复后自动重新加入 - 后端需提供轻量
/health接口(返回 200 + 空响应体即可)
失败请求不卡死,自动切到其他节点
单次请求失败 ≠ 整个节点不可用,要靠重试与调度策略配合:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 设置
failonstatus=500,502,503,504:后端返回这些状态码,立刻触发该节点的失败计数 - 搭配
maxattempts=2和lbmethod=bybusyness:首次请求失败后,立即转发给下一个可用节点,用户无感知 - 每个节点设
retry=60:被标记 DOWN 后,60 秒内不参与调度,防止反复试探已宕机服务
全部节点都不可用时,避免返回空白或原始错误页
当所有成员都在 retry 冷却期或全被标记为 DOWN,mod_proxy_balancer 默认返回 503。此时应拦截并兜底:
- 用
RewriteCond %{REQUEST_STATUS} ^503$判断,并跳转本地维护页:RewriteRule ^(.*)$ /maintenance.html [R=503,L] - 确保
/maintenance.html不走代理(加ProxyPass /maintenance.html !),且文件大小 ≥256 字节,避免旧浏览器强行显示默认错误页 - 更轻量方式:直接配
ErrorDocument 503 /maintenance.html,效果相同但写法更简洁
辅助手段:人工干预与状态可视
出问题时需要快速确认和临时处置:
- 启用
/balancer-manager(需mod_status和访问控制),实时查看各节点状态、当前连接数、失败次数 - 可手动禁用异常节点:
curl -X POST /balancer-manager -d "b=mycluster" -d "a=disable" -d "w=http://bad-node:8080" - 记录详细日志辅助排查:
LogLevel proxy:debug,配合ProxyBadHeader Ignore防止因后端响应头异常导致整个请求失败

















