Apache默认不启用ProxyPass长连接复用,需显式配置keepalive=On、ProxySet超时与连接池参数,并确保后端支持Keep-Alive及使用event MPM,否则每请求新建TCP连接导致高延迟与后端压力。

Apache 默认的 HTTP 代理在负载均衡场景下,对长连接(Keep-Alive)的支持需要显式配置,否则每个请求都会新建 TCP 连接,造成后端压力大、延迟高。关键在于启用连接复用、合理设置超时与连接池,并确保后端服务也支持 Keep-Alive。
启用并配置连接池
Apache 使用 <Proxy> 块管理后端连接池,需明确设置最大连接数、获取超时等参数:
- maxconnections:单个后端节点允许的最大并发连接数(建议设为 50–200,依后端容量调整)
-
acquire:等待空闲连接的毫秒数(如
acquire=3000,避免线程阻塞过久) -
retry:节点故障后重新探测的时间(单位秒,如
retry=60) -
timeout:单次请求代理超时(如
timeout=10),不等于连接空闲超时
示例配置:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
BalancerMember http://192.168.1.101:8080 route=node1 max=200 acquire=3000
BalancerMember http://192.168.1.102:8080 route=node2 max=200 acquire=3000
ProxySet lbmethod=bybusyness maxconnections=50 timeout=10 retry=60
</Proxy>
开启 HTTP Keep-Alive 并透传头信息
Apache 作为代理,默认可能关闭上游连接复用。需确保以下两点生效:
- 在
<VirtualHost>中添加ProxySet keepalive=On(或在<Proxy>内设) - 保留客户端的
Connection和Keep-Alive头:用RequestHeader unset Connection配合Header always set Connection "keep-alive"控制行为 - 设置后端响应头中的
Keep-Alive参数(如timeout=5, max=100),需后端配合(如 Tomcat 的connectionTimeout和maxKeepAliveRequests)
优先使用 AJP 协议替代 HTTP
若后端是 Tomcat 等 Java 应用服务器,强烈推荐改用 AJP 协议代理——它原生支持长连接复用、更小报文开销、无 HTTP 头解析开销:
- 启用
mod_proxy_ajp模块(a2enmod proxy_ajp或手动加载LoadModule proxy_ajp_module modules/mod_proxy_ajp.so) - 将
BalancerMember地址改为ajp://host:8009/(Tomcat 默认 AJP 端口) - AJP 连接默认启用长连接,无需额外配置
keepalive,性能提升显著
验证连接复用是否生效
可通过以下方式确认长连接已复用:
- 查看 Apache 日志中
%{X-Forwarded-For}i与%{Connection}i字段,多次请求是否共用同一源端口 - 用
ss -tnp | grep :8080观察到稳定存在的 ESTAB 连接(而非大量 TIME-WAIT) - 后端应用日志中,同一客户端 IP 在短时间内复用相同线程/连接 ID

















