Apache负载均衡不重试同一后端,而是通过mod_proxy_balancer配置lbmethod=byrequests、maxattempts=2、retry=15、timeout=5、failonstatus=500,502,503,504及ping探测实现故障转移式“重试”,并用mod_rewrite兜底503跳转至maintenance.html。

Apache 的负载均衡本身不重试请求,它只做一次转发;所谓“重试效果”,其实是通过故障转移机制,在当前后端失败后,把同一请求调度到另一个可用节点上——前提是配置正确、模块启用、参数协同。
必须启用 mod_proxy_balancer 并使用支持重试的算法
仅靠 ProxyPass 指向普通 URL 无法触发任何容错逻辑。必须使用 balancer:// 协议,并确保以下模块已加载:
- mod_proxy_balancer(核心,必须启用)
- mod_lbmethod_byrequests 或 mod_lbmethod_bytraffic(推荐 byrequests,行为更可预测)
在配置中显式指定调度方式:
<Proxy "balancer://api"><br> BalancerMember http://10.0.1.10:8080<br> BalancerMember http://10.0.1.11:8080<br> ProxySet lbmethod=byrequests<br> ProxySet maxattempts=2<br></Proxy>
注意:maxattempts=1 是默认值,等于禁用重试;设为 2 才表示最多尝试两个不同节点。
让节点“可跳过”且“能回归”的关键参数
单有 maxattempts 不够,还需控制节点失效判定与恢复节奏:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- retry=15:节点被标记为失效后,15 秒内不参与新请求分发;超时后首次请求会试探,成功即恢复,失败继续隔离
- timeout=5:单次请求等待上限为 5 秒,超时即视为失败,触发换节点逻辑
- failonstatus=500,502,503,504:收到这些状态码也计入失败,立即触发 retry 冷却期(不能只依赖连接失败)
这些参数需写在每个 BalancerMember 行后,例如:
BalancerMember http://10.0.1.10:8080 timeout=5 retry=15 failonstatus=500,502,503,504
前置探测避免把请求发给假存活节点
从 Apache 2.4.33 起,可用 ping 参数在转发前轻量探测:
-
ping=5,HEAD,/health:每 5 秒对
/health发一次 HEAD 请求,非 2xx 或超时则本次跳过该节点 - 该机制不改变节点状态,也不计入
retry,仅影响当次调度决策 - 若后端健康接口响应较慢(如 3 秒),建议设
ping_timeout=4避免误判(注意:默认 1 秒不可调,仅 2.4.33+ 支持自定义)
全部后端都不可用时的兜底处理
当所有节点都在 retry 期内或全部被标记为 DOWN,Apache 默认返回 503。可通过 mod_rewrite 拦截并跳转至本地静态页:
RewriteCond %{ENV:REDIRECT_STATUS} ^503$<br>RewriteRule ^(.*)$ /maintenance.html [R=503,L]
确保 /maintenance.html 存在于 DocumentRoot 下,且该路径不经过代理链路。

















