mod_proxy_balancer通过retry、failonstatus、ping、timeout等参数实现故障转移与重试:retry设冷却期(如retry=15),failonstatus依状态码标记失效(如failonstatus=500-599),ping前置探测(ping=5),timeout控制请求超时(timeout=30),并需配置lbmethod=byrequests和maxattempts=2以启用重试。

Apache的mod_proxy_balancer模块支持故障转移和重试机制,关键在于合理配置后端节点(ProxyPass中的balancer://)及各worker的参数,尤其是retry、failonstatus、ping和timeout等选项。
retry:定义故障节点恢复前的等待时间
retry是核心参数,单位为秒,表示某worker在被标记为“失效”后,多长时间内不参与请求分发。它不是重试次数,而是“冷却期”。默认值为60秒。
- 设为
retry=0:节点一旦失败即永久剔除(除非手动启用或重启服务) - 设为
retry=10:节点失败后10秒内不接收新请求,之后自动重新加入负载池 - 建议根据后端服务典型恢复时长设定,如Spring Boot健康检查周期为5秒,可设
retry=15避免过早重试
failonstatus:主动识别失败响应并触发故障转移
仅靠连接超时或拒绝无法覆盖所有异常场景,failonstatus可基于HTTP状态码主动将worker标记为失效。
- 例如:
failonstatus=500,502,503,504,当后端返回这些状态时,当前worker立即进入retry冷却期 - 支持范围写法:
failonstatus=500-599 - 注意:该判断发生在代理收到完整响应后,不适用于连接中断类错误
ping与timeout:控制健康探测与请求级超时
ping用于前置探测,timeout约束单次请求生命周期,二者协同影响故障感知速度。
-
ping=5:在转发请求前,先向后端发送一个HEAD请求,5秒内无响应则跳过该worker(不计入retry,仅本次跳过) -
timeout=30:单次请求最大等待30秒,超时后尝试下一个可用worker(需配合lbmethod=bytraffic或byrequests等支持重试的算法) -
ping和timeout都应略小于后端实际处理上限,避免误判;例如后端最长响应为8秒,可设ping=10、timeout=12
其他辅助参数:启用重试逻辑的关键前提
仅配置上述参数还不够,还需确保负载均衡器行为支持自动重试:
-
lbmethod=byrequests或bytraffic:必须使用支持worker轮询与故障跳过的调度算法(bybusyness已废弃) -
maxattempts=2:指定最多尝试几个worker,默认为1(即不重试),设为2表示首次失败后自动选下一个可用节点 -
nofailover=Off:确保开启故障转移(默认开启,显式设置更稳妥)









