ajp连接apache与tomcat需确保mod_proxy_ajp显式启用、tomcat ajp绑定127.0.0.1、proxypass路径严格匹配、手动透传x-forwarded-for等关键头,否则易现503、ip丢失、404等问题。

用 AJP 协议连接 Apache 和 Tomcat,核心不是“配通就行”,而是让二进制协议稳稳跑起来、不暴露端口、不丢真实 IP、不触发 503 错误。AJP 比 HTTP 代理快,但默认不启用、不安全、不自动透传客户端信息——这些才是实际部署中最常卡住的点。
确保 Apache 正确加载 mod_proxy_ajp 模块
AJp 代理能力不是默认开启的。Apache 2.4 只默认加载 mod_proxy,mod_proxy_ajp 必须显式启用,否则 ProxyPass ajp:// 会静默失败或报 “Invalid URL”。
- 运行
httpd -M | grep proxy(CentOS/RHEL)或a2enmod -l | grep proxy(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.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
如果同时启用了 mod_jk,建议禁用它——两者共存可能引发连接复用错乱,出现随机 Connection refused 或 503。
严格限定 Tomcat 的 AJP Connector 绑定地址
Tomcat 默认的 AJP 配置监听 0.0.0.0:8009,等于把内部通信端口直接暴露在公网,既不安全,又常因 IPv6 回环地址(::1)与 Apache 的 127.0.0.1 不匹配而连不上。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 编辑
$CATALINA_HOME/conf/server.xml,找到或新增 AJP Connector,并强制指定address="127.0.0.1":
- 若 Apache 与 Tomcat 分离部署,把
address改为 Tomcat 实际内网 IP(如192.168.21.31),并确保防火墙放行该 IP + 8009 端口 - 重启 Tomcat 后执行
ss -tlnp | grep :8009,输出应为127.0.0.1:8009,而非*:8009或:::8009
Apache ProxyPass 路径必须与 Tomcat context path 完全一致
路径错位会导致静态资源 404、重定向跳转错误、Session 丢失等隐蔽问题,且不易排查。
- 假设 Tomcat 应用部署为
/myapp(即 WAR 包名为myapp.war),Apache 配置必须写成:
ProxyPass /myapp ajp://127.0.0.1:8009/myapp
ProxyPassReverse /myapp ajp://127.0.0.1:8009/myapp
- 结尾斜杠必须统一:Tomcat 是根应用(
ROOT.war),就写ProxyPass / ajp://127.0.0.1:8009/;写成/与/不一致会破坏重定向逻辑 - 避免使用
ProxyPassMatch(如^/(.*\.jsp)$):AJP 不解析 URL,这类规则会绕过代理,直接交由 Apache 处理,导致 JSP 源码泄露风险
手动补全关键请求头,保障真实信息透传
AJP 协议本身不自动设置 X-Forwarded-For、X-Forwarded-Proto 等头,也不支持 WebSocket。若后端依赖真实客户端 IP 或 SSL 状态,必须在 Apache 中显式补充。
- 添加真实 IP 透传:
RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s - 标识协议类型(尤其启用 HTTPS 前端时):
RequestHeader set X-Forwarded-Proto "https" - WebSocket 请求需额外处理:AJP 不支持
ws/wss,必须改用mod_proxy_wstunnel并走 HTTP 协议代理










