必须确保mod_proxy_ajp模块启用、tomcat ajp connector绑定具体地址(如127.0.0.1)、proxypass路径与应用context path严格一致(含斜杠)、集群中通过balancer://配置并用jvmroute+stickysession实现jsessionid粘性会话。

用 mod_proxy_ajp 连接 Apache 与 JBoss/Tomcat 集群,核心是让 Apache 做反向代理 + 负载均衡,同时复用 AJP 协议的低开销和精准透传能力。关键不在“配得全”,而在“配得准”——模块加载、地址绑定、路径对齐、会话保持这四点卡住就全盘失效。
确保 mod_proxy_ajp 模块已启用且无冲突
Apache 2.4 不默认加载 mod_proxy_ajp,它和 mod_proxy 是分离模块,不显式启用就静默失败,不会报错,只会返回 503。
- 运行
httpd -M | grep proxy_ajp,确认输出含proxy_ajp_module (shared) - 检查
/etc/httpd/conf.modules.d/00-proxy.conf(或对应路径),确保LoadModule proxy_ajp_module modules/mod_proxy_ajp.so未被注释 - 禁用
mod_jk:两者共存时可能争抢 AJP 端口,导致 Connection refused 或连接复用异常
Tomcat/JBoss 的 AJP Connector 必须显式绑定地址
默认配置 <connector port="8009" protocol="AJP/1.3"></connector> 监听 *:8009,既不安全,也常因 IPv6 回环(::1)与 Apache 的 127.0.0.1 不匹配而连不上。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 编辑
$CATALINA_HOME/conf/server.xml,强制指定address="127.0.0.1"(单机部署)或实际内网 IP(如192.168.21.31) - 重启后执行
ss -tlnp | grep :8009,确认监听地址为127.0.0.1:8009,而非*:8009或:::8009 - 若集群跨机器,确保防火墙放行该端口(如
firewall-cmd --permanent --add-port=8009/tcp)
ProxyPass 路径必须与应用 context path 严格一致
路径错一位,静态资源 404、重定向跳转错乱、JSESSIONID 丢失就全来了。AJP 不解析 URL,只做字节流转发,所以路径不是“近似匹配”,而是“字面匹配”。
- 假设 Tomcat 应用部署在
/myapp,则 Apache 配置必须写成:ProxyPass /myapp ajp://192.168.21.31:8009/myappProxyPassReverse /myapp ajp://192.168.21.31:8009/myapp - 结尾斜杠必须统一:/myapp 和 /myapp/ 是两个不同路径,不能混用
- 避免用
ProxyPassMatch匹配后缀(如^/(.*\.jsp)$),它会绕过 AJP 代理逻辑,降级为 HTTP 处理
集群场景下启用负载均衡与会话保持
单节点用 ProxyPass 就够了;多节点必须上 balancer://,并靠 JSESSIONID 实现粘性会话。
- 在 Apache 配置中定义集群:
<proxy balancer:><br> BalancerMember ajp://192.168.21.31:8009 route=jvm1<br> BalancerMember ajp://192.168.21.32:8009 route=jvm2<br></proxy>
- 虚拟主机中使用:
ProxyPass / balancer://cluster/ stickysession=JSESSIONID|jsessionid nofailover=On
注意大小写:Tomcat 默认用大写JSESSIONID,JBoss 可能小写,需按实际 Cookie 名调整 - 每个 Tomcat 的
server.xml中,<engine></engine>标签要加jvmRoute="jvm1",与route=值严格对应










