Apache中配置ProxyPass的keepalive=On可复用TCP连接以降开销、减后端压力,但需配合timeout=5、retry=30、keepalive_timeout=5等参数,并确保后端支持Keep-Alive及MPM切换为event模式。

在 Apache 中配置 ProxyPass 的 keepalive 参数,核心目标是让代理层与后端服务(如 Tomcat、Node.js)之间复用 TCP 连接,从而降低握手开销、减少后端连接数压力、提升高并发下的响应稳定性。这不是简单加个参数就能生效,而需结合协议支持、超时控制和后端协同调优。
keepalive=On 必须显式启用并写对位置
keepalive=On 是 mod_proxy 支持的真实参数(Apache 2.4.33+),但必须直接附加在 ProxyPass 指令末尾,不能放在 ProxySet 或其他块里——否则不生效。
- ✅ 正确写法:
ProxyPass /api http://192.168.1.20:8080/api keepalive=On - ❌ 错误写法:
ProxySet keepalive=On单独写(仅对块内所有 ProxyPass 生效,易被覆盖) - ⚠️ 注意:WebSocket 场景必须用
mod_proxy_wstunnel,且keepalive=On是强制要求,否则每个消息都新建连接
配套超时参数要严格匹配后端能力
只开 keepalive=On 不设超时,会导致空闲连接长期占用后端资源,尤其当后端连接池有限时(如 Tomcat 默认 maxConnections=200),极易触发连接耗尽或线程阻塞。
-
keepalive_timeout=5:建议设为 3–10 秒,必须 ≤ 后端的connectionTimeout(如 Tomcat 的server.xml中connectionTimeout="20000") -
timeout=5:控制单次请求最大等待时间,防止慢后端拖垮整个连接池 -
retry=30:后端故障时,该连接在 30 秒内不参与新请求分发,避免雪崩
后端必须同步支持长连接维持
Apache 开了 keepalive=On,若后端主动关闭连接,复用就失效。以 Tomcat 为例:
- AJP 连接器需配置:
connectionTimeout="60000" keepAliveTimeout="60000" - HTTP 连接器需确认未禁用 keep-alive:
disableUploadTimeout="false",且不强制Connection: close - Spring Boot 应避免在响应中写
response.setHeader("Connection", "close")
高并发场景下还要切换 MPM 模式
即使 keepalive 配置正确,若 Apache 使用 prefork MPM,每个长连接仍占一个进程,万级并发时内存直接爆掉。
- 必须切换为
eventMPM:a2dismod mpm_prefork && a2enmod mpm_event - 配合系统级调优:
ulimit -n 65536、net.core.somaxconn = 65535 - 验证是否生效:
httpd -V | grep -i mpm输出应含mpm_event











