AJP连接Apache与Tomcat的核心是确保协议稳定运行、规避安全风险并精准透传客户端信息;需显式加载mod_proxy_ajp模块、限定Tomcat AJP绑定地址为127.0.0.1(或内网IP)、严格对齐ProxyPass路径,并手动补全X-Forwarded-For等头,否则易出现503、IP丢失或重定向错误。
用
连接 Apache 和 Tomcat,核心不是“配对成功”,而是让二进制 AJP 协议真正跑起来、不掉链子、不暴露风险、不丢真实信息。AJP 比 HTTP 代理快,但默认不启用、不安全、不自动透传 IP——这些才是卡住 90% 部署的关键。
确保 mod_
proxy
_ajp 模块已加载且无冲突
Apache 2.4 默认只启
,
必须显式加载,否则
会静默失效或报
:
运行
(CentOS/RHEL)或
(Debian/Ubuntu),确认输出含
检查模块加载文件(如
或
),确保两行都未被注释:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
禁用
:两者共存可能引发连接复用错乱,出现
或随机 503
Tomcat 端必须启用并限定 AJP Connector 绑定地址
AJP 默认监听
,等于把内部通信端口直接暴露公网——这是高危配置,也是“本地通、线上不通”的最常见原因:
Apache 2.4.62
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
下载
编辑
,找到或新增 AJP Connector,并强制指定
:
若 Apache 与 Tomcat 分离部署,
改为 Tomcat 实际内网 IP(如
),同时确保防火墙放行该 IP+8009
重启 Tomcat 后验证:
应显示
,而非
Apache ProxyPass 路径必须与 Tomcat context path 严格对齐
路径错位会导致静态资源 404、重定向跳转到错误地址、Session 丢失等隐蔽问题:
假设 Tomcat 应用部署在
(即 WAR 包名为
),Apache 配置必须写成:
ProxyPass /myapp ajp://127.0.0.1:8009/myapp
ProxyPassReverse /myapp ajp://127.0.0.1:8009/myapp
结尾斜杠必须一致:如果 Tomcat context 是
(ROOT 应用),就写
;写成
与
表面一样,但少一个斜杠可能导致 Location 头重写失败
禁止使用
匹配后缀(如
):AJP 不解析 URL 后缀,这类规则容易绕过 AJP 直接走 HTTP 回退,失去协议优势
补全客户端信息透传与常见故障排查
AJP 协议本身不自动携带
、SSL 状态等关键头,需手动补全;503 错误往往不是配置写错,而是底层连不上:
在
前添加头透传(尤其用了
的 Tomcat):
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}s"
RequestHeader set X-Forwarded-Proto "http"
(若前端有 TLS 终止,改为
)
503 “Service Temporarily Unavailable” 三大真因:
– Tomcat AJP connector 未启用或绑定地址不符(IPv4 vs IPv6)
– SELinux 或防火墙拦截 8009(RHEL/CentOS 上执行
临时测试)
– Apache 工作进程卡死:查日志
,重点看
或
AJP 不支持 WebSocket:需代理
或
,必须额外启用
并改用
走 HTTP 协议
mod_proxy_ajpmod_proxymod_proxy_ajpProxyPass ... ajp://Invalid URLhttpd -M | grep proxya2enmod -l | grep proxyproxy_ajp_module (shared)/etc/httpd/conf.modules.d/00-proxy.conf/etc/apache2/mods-available/proxy_ajp.loadmod_jkConnection refused0.0.0.0:8009$CATALINA_HOME/conf/server.xmladdress="127.0.0.1"address192.168.21.31ss -tlnp | grep :8009127.0.0.1:8009*:8009/myappmyapp.war/ProxyPass / ajp://.../ProxyPass / ajp://.../ProxyPass / ajp://.../ProxyPassMatch.*\.jsp$X-Forwarded-ForProxyPassRemoteIpValvehttpssetenforce 0tail -f /var/log/httpd/error_log | grep -i ajpconnection refusedtimeoutws://wss://mod_proxy_wstunnelProxyPass /ws ws://...