apache的“重试”实为故障转移式调度,需启用mod_proxy_balancer、设lbmethod=byrequests/bytraffic、maxattempts≥2、timeout、failonstatus、retry及ping等参数协同实现换节点再试,并通过rewrite兜底降级。

Apache 本身不主动重试失败请求,所谓“重试”其实是通过 mod_proxy_balancer 实现的故障转移式调度:当一个后端失败,自动换另一个健康节点再试一次。关键不是重复发给同一个后端,而是换人再试。
启用负载均衡器与支持重试的算法
必须加载并启用 mod_proxy_balancer 及对应调度模块:
- 确认已启用:
a2enmod proxy_balancer lbmethod_byrequests(Debian/Ubuntu)或检查httpd -M | grep proxy输出含proxy_balancer_module -
BalancerMember必须放在<proxy></proxy>块内,ProxyPass目标必须是balancer://xxx协议,否则容错逻辑完全不生效 -
ProxySet lbmethod=byrequests(推荐)或bytraffic:这两个算法支持maxattempts;bybusyness已废弃且部分版本不兼容重试 -
ProxySet maxattempts=2:默认为 1,设为 2 才表示允许失败后换一个节点再试;设为 3 可最多尝试三个节点
定义什么算“失败”并控制恢复节奏
单靠连接断开不够,需覆盖超时、5xx 响应等常见异常:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
timeout=5:单次请求等待上限 5 秒,超时即放弃当前节点,触发maxattempts换人 -
failonstatus=500-599或failonstatus=502,503,504:收到对应响应后立即标记该节点失效,进入冷却期 -
retry=15:节点被标记失效后,15 秒内不接收新请求;超时后首次请求会试探,成功则立刻恢复,失败则继续隔离 - 避免
retry=0:会导致节点永久下线,除非手动启用或重启 Apache
前置探测提升故障识别速度(Apache ≥ 2.4.33)
仅靠请求失败反馈太被动,ping 可在转发前轻量探测,避免把请求发给明显卡死的节点:
-
ping=5,HEAD,/health:每 5 秒对/health发一次 HEAD 请求;非 2xx 或超时即本次跳过该节点(不改变其状态,也不计入retry) -
ping_timeout不可调,默认 1 秒;若后端健康接口较慢(如耗时 2 秒),易误判,此时建议改用mod_proxy_hcheck主动健康检查 - 注意
ping和timeout应错开:例如后端 P95 响应为 8 秒,可设ping=10、timeout=12,防止探针误杀正常节点
兜底降级:所有后端都不可用时的应对
当全部节点处于 retry 冷却期或全部被标记为 DOWN,Apache 默认返回 503。可用 mod_rewrite 拦截并跳转到本地静态页:
- 添加配置:
RewriteCond %{ENV:REDIRECT_STATUS} ^503$+RewriteRule ^(.*)$ /maintenance.html [R=503,L] - 确保
/maintenance.html存在于DocumentRoot下,且路径不经过代理 - 配合
ProxyBadHeader Ignore:防止后端返回非法响应头导致代理直接中断,保留更多重试机会










