failonstatus是Apache负载均衡中用于基于HTTP状态码主动标记后端节点失败的关键参数,需配合balancer://集群使用,支持逗号分隔或范围写法(如failonstatus=500-599),并在收到完整响应后触发retry冷却期与故障转移。

在 Apache 中,failonstatus 是 ProxyPass 指令的一个关键参数,用于让反向代理在收到后端返回的特定 HTTP 状态码时,**自动将该后端节点标记为“失败”并暂时隔离**,从而触发故障转移。它不依赖连接超时或拒绝,而是基于业务层面的响应结果做判断,特别适合识别应用层异常(如服务降级、熔断、健康检查失败等)。
failonstatus 的作用机制
该参数生效的前提是使用了 balancer:// 负载均衡集群(即配合 mod_proxy_balancer)。当某个 BalancerMember 返回被 failonstatus 列出的状态码时,Apache 会立即把该 worker 标记为 down,并启动 retry 冷却期——在此期间不再向它转发新请求。
注意:这个判断发生在代理收到完整响应之后,对连接中断、超时、DNS失败等网络层问题无效;这类问题需靠 timeout、ping 或连接池参数协同处理。
如何正确配置 failonstatus
它必须写在 ProxyPass 行末尾,格式统一为逗号分隔或范围写法:
ProxyPass / balancer://mycluster/ failonstatus=502,503,504ProxyPass / balancer://mycluster/ failonstatus=500-599-
ProxyPass / balancer://mycluster/ failonstatus=429,503(适用于限流或维护中返回 429/503 的场景)
常见推荐组合(兼顾实用性与收敛性):
- 基础容错:
failonstatus=502,503,504(网关类错误) - 增强业务感知:
failonstatus=429,500-599(覆盖服务内部异常 + 限流 + 维护提示) - 对接 Spring Boot Actuator:
failonstatus=503,配合健康端点返回503 Service Unavailable主动下线节点
配套必须设置的关键参数
单独设 failonstatus 不足以形成闭环,需同步配置以下参数才能让隔离和恢复真正生效:
-
retry:定义节点被标记失败后多久重新尝试接入,单位秒。例如
retry=15表示 15 秒后自动重试。建议略大于后端健康检查周期(如 Spring Boot 默认 5s,可设 15–30s) -
timeout:控制代理到后端的请求超时,避免长等待拖垮负载均衡器。例如
timeout=10 -
maxattempts:配合重试逻辑,限制单次请求最多转发几次(默认 1)。设为
maxattempts=2可启用一次故障转移重试
这些参数通常通过 ProxySet 在 <proxy></proxy> 块内统一设定,例如:
<Proxy balancer://mycluster><br> BalancerMember http://192.168.1.101:8080<br> BalancerMember http://192.168.1.102:8080<br> ProxySet lbmethod=byrequests<br> ProxySet failonstatus=500-599<br> ProxySet retry=15 timeout=10 maxattempts=2<br></Proxy><br>ProxyPass / balancer://mycluster/<br>ProxyPassReverse / balancer://mycluster/
验证与调试建议
配置完成后,可通过以下方式确认是否生效:
- 访问
/balancer-manager(需提前配置并仅限内网),查看各节点状态栏是否出现 “Down” 并显示 “Failed with status X” - 主动触发后端返回指定状态码(如用 curl 请求一个返回 503 的测试接口),观察对应节点是否在 retry 时间内变为灰色且不再接收流量
- 检查 Apache 错误日志(
ErrorLog),搜索proxy_balancer或status关键词,确认是否有 “worker marked down due to status” 类记录


















