关键在于模块加载、tomcat ajp启用与绑定、路径严格对齐、真实信息透传四环节全部到位,任一缺失均会导致静默503错误;需确认proxy_ajp_module已启用、address限定为127.0.0.1或内网ip、proxypass路径字面匹配context path、手动补全x-forwarded-for等头。

要在 Apache 中正确配置 mod_proxy_ajp,关键不是堆参数,而是确保四个基础环节全部到位:模块加载、Tomcat AJP 启用与绑定、路径严格对齐、真实信息透传。漏掉任一环,都会静默失败(比如 503 错误但日志无明确提示)。
确认并启用 mod_proxy_ajp 模块
Apache 2.4 不默认启用该模块,且不报错,只静默失效:
- 运行
httpd -M | grep proxy_ajp(RHEL/CentOS)或a2enmod -l | grep proxy_ajp(Debian/Ubuntu),确认输出含proxy_ajp_module (shared) - 检查模块加载文件(如
/etc/httpd/conf.modules.d/00-proxy.conf或/etc/apache2/mods-available/proxy_ajp.load),确保以下两行未被注释:LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_ajp_module modules/mod_proxy_ajp.so - 禁用
mod_jk:两者共存会争抢 AJP 连接,引发随机 Connection refused 或 503
Tomcat 端必须启用并限定 AJP Connector
AJP 默认不开启,且监听 *:8009 是高危配置,也是本地通、线上不通的主因:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 编辑
$CATALINA_HOME/conf/server.xml,找到或新增 AJP Connector,并强制指定address:<connector port="8009" protocol="AJP/1.3" address="127.0.0.1" redirectport="8443" connectiontimeout="60000"></connector> - 单机部署用
127.0.0.1;跨机器部署则改用 Tomcat 实际内网 IP(如192.168.21.31),并确保防火墙放行该端口 - 重启 Tomcat 后执行
ss -tlnp | grep :8009,应显示127.0.0.1:8009,而非*:8009或:::8009
Apache 配置 ProxyPass 路径必须字面匹配
AJP 不解析 URL,只做字节流转发,路径错一位就会导致静态资源 404、重定向跳转错误、Session 丢失:
- 若 Tomcat 应用部署在
/myapp(WAR 名为myapp.war),Apache 必须写成:ProxyPass /myapp ajp://127.0.0.1:8009/myappProxyPassReverse /myapp ajp://127.0.0.1:8009/myapp - 结尾斜杠必须统一:
/myapp和/myapp/是两个不同路径,不可混用 - 避免使用
ProxyPassMatch(如匹配^/(.*\.jsp)$),它会绕过 AJP 代理逻辑,降级为 HTTP 处理
补全客户端真实信息与基础安全
AJP 协议本身不自动设置 X-Forwarded-For 或传递 SSL 状态,需手动注入:
- 添加头信息以透传真实 IP:
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}s"RequestHeader set X-Forwarded-Proto "https"(若前端有 HTTPS 终止) - 若需支持会话粘性(集群场景),配合 Tomcat 的
jvmRoute使用:
Tomcat<engine name="Catalina" jvmroute="tomcat1"></engine>
Apache:ProxyPass / balancer://mycluster/ stickysession=JSESSIONID - WebSocket 不支持 AJP,需额外启用
mod_proxy_wstunnel并走 HTTP 协议代理










