acquire参数控制apache从连接池获取后端连接的最大阻塞等待毫秒数,仅在启用keepalive且加载mod_proxy_http时生效,必须通过块+proxyset设置,单位为毫秒。

acquire 参数控制 Apache 从连接池中获取一个可用后端连接时,最多愿意阻塞等待多少毫秒。它不是控制建连超时,也不是响应读取超时,而是专用于连接复用场景下的“排队等待”环节——当所有连接都被占用、又还没达到 max 上限时,Apache 会等一会儿,看有没有空闲连接释放出来。
这个参数只在满足两个前提时才生效:
- 后端支持 HTTP/1.1 keepalive(比如 Tomcat、Node.js 默认开启)
- Apache 加载了
mod_proxy_http,且启用了连接池机制(默认开启)
acquire 必须通过 <proxy></proxy> 块 + ProxySet 设置
你不能直接写在 ProxyPass 行末尾,例如 ProxyPass /app http://127.0.0.1:8080/ acquire=5000 是无效的。正确写法是:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<proxy>
ProxySet acquire=5000
ProxySet max=20
ProxySet min=2
</proxy>
ProxyPass /app http://127.0.0.1:8080/
ProxyPassReverse /app http://127.0.0.1:8080/
-
acquire=5000:最多等 5 秒,若 5 秒内没拿到空闲连接,就返回 503 Service Unavailable -
max=20:每个 Apache 子进程/线程最多维护 20 个到该后端的并发连接(注意:受 MPM 模型限制) -
min=2:常驻 2 个空闲连接,避免冷启动建连开销
acquire 和 timeout 的关系要理清
-
acquire是“等连接”的时间(毫秒),发生在连接池内部调度阶段 -
timeout(在ProxySet中)是整个代理请求生命周期上限(秒),含建连 + 发请求 + 收响应头 + 收响应体 - 二者共存时,
acquire先触发:如果连接池满且超时,就不会进入后续流程;否则才走timeout控制的整体耗时
建议设置梯度:
-
acquire设为 2000–5000(2–5 秒)较合理,太短易触发 503,太长会让请求卡住不释放 -
timeout应明显大于acquire,例如timeout=30,留出足够处理时间
验证 acquire 是否起作用
可配合压测观察:
- 用
ab -n 100 -c 30 http://your-proxy/app/模拟高并发 - 查看 Apache 错误日志是否出现
[proxy:error] ... AH00940: HTTP: failed to make connection to backend: No space left on device或类似提示(说明 acquire 触发排队失败) - 用
ss -tnp | grep :8080观察后端连接数是否稳定在max附近,且空闲连接数接近min
注意事项
-
acquire单位是毫秒,不是秒,写成acquire=5是等 5 毫秒,基本等于立即失败 - 它对
http://后端有效,对https://后端也有效,但 TLS 握手耗时会计入timeout,不计入acquire - 如果后端本身连接处理慢(如数据库锁死),
acquire不会缓解问题——那是timeout或后端自身优化的事 - 修改后需重载配置:
sudo apachectl graceful,无需重启
不复杂但容易忽略。










