Apache mod_proxy无直接ConnectionTimeout参数,需用acquire控制连接获取超时、timeout约束响应总时长、ping实现HEAD探测、KeepAliveTimeout管理空闲连接寿命,并协同后端配置。

Apache 的 mod_proxy 本身不提供直接命名的 ConnectionTimeout 参数,但可通过组合 timeout、ping、KeepAliveTimeout 和底层连接池控制(如 acquire)来实现等效效果。关键在于区分“连接建立超时”“健康探测延迟”和“空闲连接保持时间”这三类行为,并按需配置。
用 timeout 和 acquire 控制后端连接建立与获取
timeout 是 ProxyPass 或 ProxySet 中最接近“连接超时”的参数,但它实际约束的是整个请求生命周期(含读响应),不是纯 TCP 连接建立阶段。真正影响连接建立等待的是 acquire —— 它定义从连接池获取一个可用连接的最大等待毫秒数。
-
acquire=3000:若连接池暂无空闲连接,最多等 3 秒,超时则报proxy: error reading status line类错误 -
timeout=20:请求转发后,等待后端完整响应的总时长上限为 20 秒(含网络传输+处理) - 二者需配合:比如后端平均建连耗时 800ms,设
acquire=1500可避免长时间排队;timeout应略大于后端最长业务响应时间
用 ping 实现轻量级存活探测
ping 不是后台轮询,而是在每次转发前向后端发一个 HEAD 请求,用于快速跳过已知不可用节点。它不触发 retry 冷却期,只影响本次请求路由。
-
ping=3:HEAD 探测 3 秒无响应,则跳过该 worker,尝试下一个 - 适合部署在高敏感场景(如支付回调路径),避免把请求发给明显卡死的实例
- 注意:后端必须支持 HEAD 方法且返回合理状态码(如 200),否则探测失败会被误判
用 KeepAliveTimeout 和 max 管理连接复用寿命
连接是否复用、复用多久,由 Apache 主进程和后端共同决定。Apache 侧通过两个参数协同控制:
-
KeepAliveTimeout 5:一个 HTTP/1.1 连接在完成请求后,空闲等待下个请求的时间上限为 5 秒。超时即关闭连接 -
ProxySet max=50:每个 Apache 子进程最多维持 50 个到该后端的持久连接(非全局总数) - 若后端也开启 keepalive(如 Tomcat 的
keepAliveTimeout设为 10 秒),两边需对齐:Apache 的KeepAliveTimeout应 ≤ 后端值,防止 Apache 单方面断连引发 RST
验证与常见失效点
改完配置后不能只靠重启,要确认是否真正生效:
- 检查模块是否加载:
apache2ctl -M | grep -E 'proxy|http',确保mod_proxy和mod_proxy_http在列表中 - 观察连接复用:
netstat -anp | grep :8080 | grep ESTABLISHED | wc -l(替换为你的后端端口),对比不同max值下的数量变化 - 抓包验证
ping行为:用tcpdump -i lo port 8080 -A,发起请求时应看到 HEAD 包出现在 GET 之前 - 若
acquire不生效,大概率是写在了块外,或目标ProxyPass没绑定到该定义











