AJP连接复用需Apache与Tomcat协同调优:Apache侧须配置keepalive=On、keepalive_timeout及retry;Tomcat侧需设置connectionTimeout、keepAliveTimeout,并匹配maxThreads与Apache并发数,否则易致连接堆积或超时。

用 mod_proxy_ajp 连接后端 Tomcat 集群时,连接复用不是默认就高效的,必须两端协同配置——Apache 侧启用 keepalive、Tomcat 侧调优 AJP connector 参数,否则容易出现连接堆积、线程空转或超时中断。
Apache 端:显式开启并约束 AJP 连接复用
AJP 协议本身支持连接复用,但 Apache 不会自动启用,需在 ProxyPass 中明确声明:
- 加 keepalive=On 参数:例如
ProxyPass /app ajp://127.0.0.1:8009/app keepalive=On - 设 keepalive_timeout=5(单位秒):建议 3–10 秒,应 ≤ Tomcat 的
connectionTimeout - 避免漏配 retry=60:故障节点在 60 秒后才重试,配合健康检查更稳妥
- 若用 balancer,
ProxySet应写在块内,统一作用于整个集群,而非单个 BalancerMember
Tomcat 端:AJP Connector 必须匹配复用策略
仅 Apache 开 keepalive 没用,Tomcat 的 AJP connector 必须支持并维持长连接:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 确认
server.xml中 AJP Connector 已启用,且含connectionTimeout="60000"和keepAliveTimeout="60000" -
maxThreads要与 Apache 的MaxRequestWorkers匹配:例如 Apache 并发 200,Tomcat 至少设maxThreads="200",否则连接排队 - 禁用
address="127.0.0.1"绑定以外的监听(如 IPv6 ::1),防止 Apache 因地址不一致连不上 - 若启用了
RemoteIPValve,Apache 需补RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s,AJP 不自动透传该头
集群场景下复用的特殊注意事项
多个 Tomcat 节点共用 AJP 连接池时,复用行为受负载均衡器调度影响:
- 使用
balancer://时,每个 BalancerMember 默认独立维护连接池;不加keepalive=On就是短连接,每请求新建 TCP - 会话粘性(
stickysession=JSESSIONID)不影响连接复用逻辑,但要求 route 值与 Tomcat 的jvmRoute严格一致 - 健康检查(如
hcmethod=GET hcuri="/health")应走 HTTP,AJP 不支持主动探测,否则检查失败导致误判下线 - 防火墙/SELinux 拦截 8009 端口会导致连接拒绝,表现为 503 错误,非配置问题——先查
tail -f /var/log/httpd/error_log | grep ajp
验证连接复用是否生效
不能只看配置,要从运行态确认:
- 在 Tomcat 的
server.xmlAJP Connector 中加enableLookups="false"和useBodyEncodingForURI="true",减少干扰 - 用
ss -tnp | grep :8009观察 ESTAB 状态连接数是否稳定(非持续涨落) - Apache 日志中搜索
ah01100(AJP connection reused)或ah01101(new connection)可判断复用率 - 对比开启前后 Tomcat 的线程堆栈(
jstack <pid>),看AjpNioProcessor线程是否长期处于WAITING而非频繁创建销毁

















