AJP并非当前最轻量稳定的选择,因CVE-2020-1938漏洞及Tomcat 8.5.51+默认禁用,生产环境推荐HTTP替代;其配置失败主因是模块未启用、AJP端口未限定绑定及ProxyPass路径不匹配。

AJP 是目前 Apache 代理 Tomcat 最轻量、最稳定的选择,但直接开箱即用大概率失败——核心问题不在配置语法,而在端口暴露、模块启用和协议对齐这三处。
确认 mod_proxy_ajp 已启用且无冲突
Apache 2.4 默认不启用 mod_proxy_ajp,只启用了基础的 mod_proxy。如果只加载了 mod_proxy 而没加载 mod_proxy_ajp,ProxyPass / ajp://... 会静默失效,日志里只报 Invalid URL in ProxyPass 或直接 503。
- 检查已加载模块:
httpd -M | grep proxy,必须看到proxy_ajp_module (shared) - 若缺失,在
/etc/httpd/conf.modules.d/下确保有类似LoadModule proxy_ajp_module modules/mod_proxy_ajp.so的行 - 不要同时启用
mod_jk和mod_proxy_ajp:两者都注册了 AJP 处理逻辑,可能引发连接复用错乱或Connection refused
Tomcat 的 AJP Connector 必须显式绑定到 127.0.0.1
默认的 <connector port="8009" protocol="AJP/1.3"></connector> 会监听 0.0.0.0:8009,把 AJP 端口暴露给外网——这是严重安全隐患,也是很多“本地能通、线上不通”问题的根源。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 修改
$CATALINA_HOME/conf/server.xml中的 AJP 配置,强制限定地址:<connector port="8009" protocol="AJP/1.3" address="127.0.0.1" redirectport="8443"></connector> - 改完后重启 Tomcat,并验证:
ss -tlnp | grep :8009应显示127.0.0.1:8009,而非*:8009 - 如果 Apache 和 Tomcat 不在同一台机器,
address改为 Tomcat 实际内网 IP(如192.168.21.31),且确保防火墙放行该 IP+端口
Apache 的 ProxyPass 必须匹配 Tomcat 的 context path
ProxyPass / ajp://localhost:8009/ 看似正确,实则极易导致路径错位:比如 Tomcat 应用部署在 /myapp,而 Apache 根路径被硬映射到 /,结果所有请求都丢进 Tomcat 根上下文,静态资源 404、重定向跳转错误。
- 若 Tomcat 应用路径是
/myapp,Apache 配置应为:ProxyPass /myapp ajp://localhost:8009/myapp - 务必同步设置
ProxyPassReverse /myapp ajp://localhost:8009/myapp,否则 Tomcat 返回的Location: /myapp/login会被 Apache 错误重写为/login - 避免使用通配符如
ProxyPassMatch ^/(.*\.jsp)$:AJP 协议本身不解析 URL 后缀,这种规则容易绕过 AJP 直接走 HTTP 回退,失去 AJP 的性能优势
验证 AJP 连通性时别只依赖 curl
curl http://localhost/ 成功 ≠ AJP 通;它可能只是 Apache 自己返回了默认页。真正验证 AJP 是否生效,得看请求是否实际抵达 Tomcat 并由其处理。
- 在 Tomcat 的
webapps/ROOT/WEB-INF/web.xml里临时加个 servlet mapping,或直接放一个test.jsp到webapps/ROOT - 访问
http://apache-host/test.jsp,同时监控 Tomcat 日志:tail -f $CATALINA_HOME/logs/catalina.out—— 如果看到类似GET /test.jsp HTTP/1.1的日志,说明走的是 HTTP connector;如果看到AjpProcessor或org.apache.coyote.ajp.AjpProcessor相关输出,才是 AJP 真正生效 - 禁用 Tomcat 的 HTTP connector(注释掉
port="8080"那行)再测试,可彻底排除 HTTP 回退干扰
最容易被忽略的是 AJP 连接器的超时参数与 Apache 的 ProxyTimeout 不匹配,尤其在上传大文件或长轮询场景下,会导致连接被单侧关闭、出现 502 Bad Gateway 或 connection reset。Tomcat 的 connectionTimeout 和 Apache 的 ProxyTimeout 建议设为相同值,且不低于 60 秒。

















