核心是Apache通过AJP二进制协议高效分发请求至多个Tomcat实例,需Tomcat启用唯一AJP端口与jvmRoute、Apache配置balancer及stickysession实现会话粘性,并协同调优线程与超时参数。

用 mod_proxy_ajp 连接 Apache 和 Tomcat 集群,核心是让 Apache 通过二进制 AJP 协议把请求高效分发到多个 Tomcat 实例,同时保持会话稳定、信息准确。它比 HTTP 代理更省资源,尤其适合动静混合、高并发场景。
Tomcat 端必须启用并正确配置 AJP Connector
AJP 不是默认开启的,漏掉这步,Apache 再怎么配都会 503。打开 conf/server.xml,确认存在且未被注释的 AJP connector,例如:
<connector port="8009" protocol="AJP/1.3" address="127.0.0.1" redirectport="8443"></connector>- 若集群跨机器,
address不能写死127.0.0.1,需改为具体监听 IP 或留空(监听所有) - 每个 Tomcat 实例的 AJP 端口要唯一(如 node1:8009、node2:8010),避免端口冲突
- 为支持 session 粘性,
<engine></engine>标签需加jvmRoute属性,如jvmRoute="tomcat1"
Apache 端加载模块并定义负载均衡组
先确保必要模块已启用:
-
mod_proxy、mod_proxy_ajp、mod_proxy_balancer必须加载 - Ubuntu 用
a2enmod proxy proxy_ajp proxy_balancer;CentOS/RHEL 检查/etc/httpd/conf.modules.d/00-proxy.conf
在虚拟主机或主配置中定义集群组:
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
<proxy balancer:></proxy>BalancerMember ajp://192.168.1.111:8009 route=tomcat1 loadfactor=1BalancerMember ajp://192.168.1.112:8009 route=tomcat2 loadfactor=1
注意:route 值必须和 Tomcat 的 jvmRoute 完全一致,这是粘性会话的匹配依据。
配置反向代理并启用 session 粘性
在 <virtualhost></virtualhost> 中设置代理规则:
ProxyPass / balancer://mycluster/ stickysession=jsessionid|JSESSIONID nofailover=OffProxyPassReverse / balancer://mycluster/-
stickysession后跟jsessionid(大小写不敏感),Apache 会自动识别 Cookie 中的 JSESSIONID 并绑定后端节点 -
nofailover=Off表示当某节点宕机时,会尝试转发到其他节点(非强粘性) - 如需透传真实客户端 IP,加上:
RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s
关键调优与排障要点
AJP 高效的前提是两端协同优化:
- Tomcat 的
maxThreads(如 200)应略高于 Apache 的MaxRequestWorkers(如 150),避免请求积压在某一层 - AJP 默认无长连接,建议在 Tomcat 的 connector 中加:
connectionTimeout="60000" keepAliveTimeout="60000" - 常见 503 错误:检查防火墙是否放行 8009 端口;用
telnet 192.168.1.111 8009测试连通性;查看 Apache error_log 中ajp相关报错 - AJP 不支持 WebSocket,wss 请求需单独用
mod_proxy_wstunnel+ HTTP 协议代理

















