apache的proxypass不支持直接设置超时和重试,须用proxytimeout控制全局代理生命周期,proxyset(在容器内)配置connectiontimeout、timeout和retry,负载均衡下retry与ping用于节点隔离和健康探测,并需对齐keepalive及后端超时。

Apache 的 ProxyPass 本身不支持直接在指令行里写超时和重试参数。真正生效的配置必须通过配套指令组合实现:用 ProxyTimeout 控制整体代理生命周期,用 ProxySet(配合 <proxy></proxy> 容器或 proxy: 协议前缀)做细粒度控制,重试策略则分场景——普通代理靠 retry,负载均衡靠 BalancerMember 的 retry 和 ping。
全局代理超时用 ProxyTimeout
这是最简单也最常用的方式,适用于所有 ProxyPass 指令,作用于整个虚拟主机或 Location 上下文:
- 它定义 Apache 等待后端响应的总上限时间(单位秒),包含建连、发请求、收响应头和体的全过程
- 默认值是 60 秒;设为 0 表示无限等待(生产环境不建议)
- 只影响“等待后端返回完整响应”的阶段,不控制 DNS 解析、SSL 握手中间耗时
- 示例:ProxyTimeout 30 放在
<virtualhost></virtualhost>块内即可生效
单后端定制超时用 ProxySet + 容器
当不同后端需要不同超时(比如 API 接口要 5 秒,文件上传要 120 秒),就得用这个方式。注意:必须把 ProxySet 写在 <proxy></proxy> 块内,不能放在 ProxyPass 行里或顶层配置中:
- connectiontimeout=3:TCP 建连阶段最大等待时间(SYN 到 SYN-ACK),单位秒,小数也支持
- timeout=30:该后端整个代理生命周期上限,等效于局部 ProxyTimeout
- 两个值要有梯度,建议 connectiontimeout 比 timeout 小至少 2 秒,避免刚连上就被中断
- 示例配置:
<proxy> ProxySet connectiontimeout=3 timeout=30 </proxy> ProxyPass /api/ http://192.168.1.20:8000/ ProxyPassReverse /api/ http://192.168.1.20:8000/
连接重试策略分两类写法
重试不是“失败后自动再发一次”,而是指故障隔离与健康探测逻辑,写法取决于是否启用负载均衡:
- 普通代理(单后端):用 ProxySet 的 retry=30,表示该后端连续失败后,30 秒内不再向它转发新请求
-
负载均衡(balancer://):retry 是 BalancerMember 的参数,例如:
BalancerMember http://192.168.1.10:8080 retry=60 - 如果启用了健康检查,还可加 ping=5,HEAD,/health,表示每次调度前先发一个 HEAD 请求探测路径 /health,5 秒无响应即标记为不可用
- 注意:ping 只在 Apache ≥ 2.4.33 且启用了 mod_proxy_balancer 时有效
别漏掉 keepalive 和后端超时对齐
光调超时没用,连接复用和前后端超时错位会直接导致 502/504 或连接僵死:
- 开启长连接复用:ProxyPass /api http://127.0.0.1:8080/api keepalive=on
- 配合 ProxySet 控制连接池:ProxySet keepalive_timeout=5 max=50 ttl=60
- 后端(如 Tomcat)的 connectionTimeout 应 ≥ Apache 的 keepalive_timeout(例如设为 20000ms)
- Apache 的 ttl 值应 ≤ 后端的 connectionTimeout,避免空闲连接被后端提前关闭











