关键不是配通,而是让AJP二进制链路稳、快、安全、信息不丢:需显式启用mod_proxy_ajp模块、Tomcat AJP Connector绑定127.0.0.1或内网IP、ProxyPass路径与context path严格对齐、配置keepalive和手动透传X-Forwarded-For头。
要在 apache 虚拟主机中用 mod_proxy_ajp 实现与 tomcat 的高效通信,关键不是“配通”,而是让 ajp 二进制链路稳、快、安全、信息不丢——这需要 apache 和 tomcat 两端协同调优,缺一不可。
确保 mod_proxy_ajp 模块已启用且无冲突
AJP 功能不会随 mod_proxy 自动加载,必须显式启用:
- 运行
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.soLoadModule proxy_ajp_module modules/mod_proxy_ajp.so - 禁用
mod_jk:两者共存可能引发连接复用错乱,导致随机 503 或 Connection refused
Tomcat 端必须限定 AJP Connector 绑定地址
默认 <connector port="8009" protocol="AJP/1.3"></connector> 监听 *:8009,既不安全,又易因地址不匹配(如 Apache 用 127.0.0.1 连,Tomcat 听 ::1)而失败:
- 编辑
$CATALINA_HOME/conf/server.xml,强制指定address="127.0.0.1"(同机部署)或内网 IP(如192.168.21.31):<connector port="8009" protocol="AJP/1.3" address="127.0.0.1" redirectport="8443" connectiontimeout="60000" keepalivetimeout="60000" maxthreads="500"></connector> - 重启 Tomcat 后执行
ss -tlnp | grep :8009,应显示127.0.0.1:8009,而非*:8009或:::8009 - 若分离部署,还需在防火墙中放行该 IP + 8009 端口
虚拟主机中 ProxyPass 路径必须严格对齐 Tomcat context path
路径错位会导致静态资源 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 - 结尾斜杠必须一致:ROOT 应用写
ProxyPass / ajp://127.0.0.1:8009/,不能漏掉末尾/ - 避免使用
ProxyPassMatch(如^/(.*\.jsp)$):AJP 不解析 URL,这类规则会绕过代理逻辑
开启连接复用并补全关键请求头
AJP 高效的核心是长连接复用,但需显式配置,且真实 IP 等信息不会自动透传:
- 在
ProxyPass中加入复用参数:ProxyPass /myapp ajp://127.0.0.1:8009/myapp keepalive=On keepalive_timeout=5 retry=60 - Tomcat 端 AJP Connector 必须匹配:已设
connectionTimeout="60000"和keepAliveTimeout="60000",且maxThreads建议 ≥ Apache 的MaxRequestWorkers - 若 Tomcat 使用
RemoteIpValve或需记录真实客户端 IP,Apache 必须手动添加:RequestHeader set X-Forwarded-For %{REMOTE_ADDR}sRequestHeader set X-Forwarded-Proto "https"(如前端有 HTTPS 卸载)
不复杂但容易忽略:AJP 不支持 WebSocket,要代理 ws:// 或 wss://,得单独用 mod_proxy_wstunnel 走 HTTP 协议。


















