apache负载均衡后端连接复用需apache与后端双向协同:apache侧必须显式配置keepalive=on、keepalive_timeout≤后端connectiontimeout、retry及proxyset策略,后端如tomcat须匹配keepalivetimeout、maxthreads等参数,否则易致连接堆积或503错误。

Apache 负载均衡器后端连接复用不是开个 keepalive=On 就完事的,必须 Apache 与后端服务(如 Tomcat、PHP-FPM 或其他 HTTP 服务)双向协同调优,否则容易出现连接堆积、线程空转、503 错误或超时中断。
Apache 侧:显式启用并约束 AJP/HTTP 连接复用
默认不复用,需在 ProxyPass 或 BalancerMember 中明确声明参数:
-
AJP 场景:ProxyPass 指令加
keepalive=On keepalive_timeout=5 retry=60,例如:ProxyPass /app ajp://127.0.0.1:8009/app keepalive=On keepalive_timeout=5 retry=60 -
HTTP 场景:同样需加
keepalive=On,且keepalive_timeout建议设为 3–8 秒,略小于后端的connectionTimeout - 若使用
balancer://,ProxySet应写在<proxy balancer:></proxy>块内,确保所有成员统一继承复用策略 - 禁用 IPv6 回环地址(如
::1)监听,防止 Apache 因地址解析不一致连不上 Tomcat 的 AJP 端口
后端服务侧:匹配复用行为,避免“单边长连”
仅 Apache 开 keepalive,后端不配合,等于白配:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
Tomcat(AJP):server.xml 中 AJP Connector 必须设置:
connectionTimeout="5000"(≤ Apache 的 keepalive_timeout),keepAliveTimeout="5000",maxThreads="200"(不低于 Apache 并发连接数) -
Tomcat(HTTP)或 Nginx 后端:需开启自身 keepalive,例如 Nginx 的
keepalive 32、keepalive_timeout 5s - 若后端启用了 RemoteIPValve,Apache 需补:
RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s,否则 AJP 不透传真实客户端 IP
集群与健康检查的复用注意事项
多节点共用连接池时,复用逻辑受调度和探测方式影响:
- 每个
BalancerMember独立维护连接池;不加keepalive=On就是每请求新建 TCP 连接 - 粘性会话(
stickysession=JSESSIONID)不影响复用本身,但要求route值与 Tomcat 的jvmRoute严格一致 - 健康检查必须走 HTTP 协议(如
hcmethod=GET hcuri="/health"),AJP 不支持主动探测,否则检查失败导致节点被误判下线 - 防火墙或 SELinux 拦截 8009(AJP)或后端端口,会导致连接拒绝,日志中常见
ajp_read_header: recv: Connection reset,先查tail -f /var/log/httpd/error_log | grep ajp
验证是否真正生效
不能只看配置,要观察运行态:
- Tomcat AJP Connector 加上
enableLookups="false" useBodyEncodingForURI="true",减少干扰项 - 执行
ss -tnp | grep :8009 | grep ESTAB | wc -l,观察 ESTABLISHED 连接数是否稳定(非持续上涨或频繁断连) - 对比开启前后,
netstat -an | grep :8009 | grep TIME_WAIT数量应明显下降










