apache proxypass 本身不支持重试,重试由 balancer 集群配置控制:retry 控制节点失效后恢复时间,maxattempts 控制单次请求最多尝试的后端数,二者协同实现容错。

Apache 的 ProxyPass 本身不直接支持重试逻辑,重试行为由后端节点的健康状态和负载均衡器的 retry 参数控制,配合 BalancerMember 和 ProxySet 实现。关键不是在 ProxyPass 行里写重试,而是通过 balancer:// 集群配置来统一管理。
重试机制依赖 retry 参数而非 ProxyPass
Apache 中的“重试”实际指:当某个后端节点因连接失败、超时等被标记为“失效”后,在指定时间后自动恢复尝试——这个行为由 retry 控制,单位是秒。
-
retry=30表示该节点被标记失效后,30 秒内不再分发请求;30 秒后重新纳入调度 - 它不改变单次请求的转发路径,也不在一次请求失败后自动换节点重发(那是
maxattempts的作用) - 节点是否被标记失效,取决于连接建立阶段是否出错(如 Connection refused、timeout),而不是响应内容
真正影响“单次请求是否换节点”的是 maxattempts
当请求首次转发失败(比如目标服务器无响应),Apache 会按顺序尝试其他可用成员,最多尝试 maxattempts 次(含首次),前提是集群中还有健康节点。
-
maxattempts=2:最多尝试 2 个后端,哪怕第一个连不上,也会立即选第二个 - 该参数需放在
<proxy></proxy>块内,用ProxySet设置 - 它和
retry协同工作:前者管“这次要不要换人”,后者管“这个人多久后能再用”
完整可运行的配置结构
以下是一个带基础容错能力的典型配置,注意层级和模块启用要求:
<proxy>
BalancerMember http://192.168.1.10:8080 loadfactor=1 timeout=3 retry=30
BalancerMember http://192.168.1.11:8080 loadfactor=1 timeout=3 retry=30
ProxySet lbmethod=byrequests maxattempts=2
</proxy>
ProxyPass /api/ balancer://api/
ProxyPassReverse /api/ balancer://api/
-
timeout=3:单次连接+请求+响应总超时为 3 秒(含 ping 探测),超时即判定失败 -
retry=30:节点失败后,30 秒内不参与调度 -
maxattempts=2:每次请求最多试两个节点,提升成功率 - 必须启用
mod_proxy、mod_proxy_balancer、mod_proxy_http
补充说明:ping 不是重试,但能降低失败率
如果你用的是 Apache ≥2.4.33,可在 BalancerMember 行加 ping=5,HEAD,/health,它会在调度前做轻量探测。虽然不叫“重试”,但它让 Apache 更大概率避开已宕机节点,间接减少需要触发 maxattempts 的场景。
- 探测失败仅跳过本次调度,不改变
retry计时 - 探测路径建议返回纯内存检查的 200,避免引入数据库等依赖
- ping 和 retry 是独立机制,可同时启用











