apache 重试需启用 mod_proxy_balancer 模块、使用 balancer:// 协议及配置 maxattempts=2、retry、timeout 和 failonstatus 等参数协同生效,缺一不可。

Apache 本身不提供“重试”语义的原生指令,所谓重试其实是通过 mod_proxy_balancer 的故障转移机制模拟出来的:当一个后端节点失败时,自动切换到下一个可用节点再试一次。这依赖于模块启用、协议写法和关键参数协同生效,缺一不可。
必须启用 mod_proxy_balancer 模块
仅加载 mod_proxy 和 mod_proxy_http 不够,balancer:// 协议和容错逻辑由 mod_proxy_balancer 提供。
- Ubuntu/Debian:运行
sudo a2enmod proxy_balancer并重启 Apache - RHEL/CentOS:确认
/etc/httpd/conf.modules.d/00-proxy.conf中有LoadModule proxy_balancer_module modules/mod_proxy_balancer.so - 验证:
httpd -M | grep proxy_balancer应输出proxy_balancer_module (shared)
ProxyPass 必须指向 balancer:// 协议
错误写法(单点代理,无重试):ProxyPass / http://backend1:8080/
正确写法(启用负载均衡与重试):
<proxy>
BalancerMember http://backend1:8080 retry=60 timeout=30
BalancerMember http://backend2:8080 retry=60 timeout=30
</proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
核心参数组合决定是否“重试”
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
maxattempts=2:这是唯一控制尝试次数的参数。默认为 1,即失败直接报错;设为 2 才会在第一个节点失败后选第二个再试一次 -
retry=60:节点被标记为失效后,60 秒内不再调度请求给它(避免雪崩) -
timeout=30:单次请求等待响应的上限,超时即触发maxattempts逻辑,换节点重试
注意:timeout 值应略大于后端 P95 响应时间,但不能超过业务容忍阈值(如用户等待上限)。
补充主动健康检查,避免假存活
仅靠连接超时无法识别“慢响应但未断连”的节点,需配合:
-
failonstatus=500-599:后端返回 5xx 状态码时立即标记该节点失效,进入retry冷却期 -
ping=5:转发前发 HEAD 探针,5 秒无响应则本次跳过该节点(不改变其状态,也不计入retry)
建议ping值略大于后端典型响应时间(如后端通常 8 秒返回,则ping=10),timeout设为12,两者错开可减少误判。
不复杂但容易忽略










