mod_proxy_ajp更轻量易维护,是apache 2.2+原生模块,无需额外编译mod_jk.so或管理workers.properties;但不支持热重载worker列表和jkstatus实时监控,且proxypass路径结尾斜杠必须严格一致。

为什么用 mod_proxy_ajp 而不是 mod_jk?
mod_proxy_ajp 是 Apache 2.2+ 原生模块,无需额外编译或下载 mod_jk.so,维护成本低;而 mod_jk 需要单独管理 workers.properties、jkstatus 页面、版本兼容性更敏感。如果你已启用 mod_proxy 系列(比如做反向代理或负载均衡),直接加 mod_proxy_ajp 是最轻量的路径。但注意:mod_proxy_ajp 不支持运行时热重载 worker 列表,也不提供类似 jkstatus 的实时监控页——这点常被忽略,直到集群出问题时才发现无法快速定位哪台 Tomcat 掉线了。
ProxyPass 和 balancer://cluster 必须配对写对
常见错误是把 ProxyPass /app ajp://127.0.0.1:8009/app 和 ProxyPass / balancer://cluster/ 混用在同一虚拟主机里,结果请求被重复代理或路径错乱。正确做法是:集群场景下只用 balancer:// 协议,且 ProxyPass 和 ProxyPassReverse 的路径结尾斜杠必须严格一致:
-
ProxyPass / balancer://cluster/✅(结尾都有/) -
ProxyPass / balancer://cluster❌(后端会收到/app变成/clusterapp) -
stickysession=JSESSIONID大小写敏感,Tomcat 默认生成的是JSESSIONID,不是jsessionid;Windows 下不区分,Linux 下可能失效 -
nofailover=On表示 session 绑定后不漂移,适合有状态应用;若设为Off,故障时会尝试转发到其他节点,但 session 数据可能丢失
Tomcat 端 AJP connector 配置不能只开个端口
很多配置只加了 <connector port="8009" protocol="AJP/1.3"></connector> 就以为完事了,结果压测时连接堆积、超时频发。真正影响吞吐的是这三个参数:
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
-
maxThreads="200":必须和 Apache 的MaxRequestWorkers匹配,否则一边排队一边空转 -
connectionTimeout="60000":AJP 默认是 -1(永不超时),容易导致连接卡死 -
keepAliveTimeout="60000":显式开启 keepalive,否则每次请求都重建 TCP 连接 - 别忘了加
jvmRoute="tomcat1"到<engine></engine>标签里,这是 sticky session 的路由依据,漏掉就等于没开集群
503 错误的真实原因往往不在 Apache 配置里
看到 Service Temporarily Unavailable 第一反应不是改 httpd.conf,而是查这三处:
- Tomcat 的 AJP
<connector></connector>是否绑定了具体 IP(如address="127.0.0.1"),而 Apache 尝试用 IPv6(::1)连 —— 改成address="0.0.0.0"或明确指定监听 IP - SELinux 或防火墙是否拦截了 8009 端口(CentOS/RHEL 上尤其常见):
setenforce 0临时验证,再配semanage port -a -t http_port_t -p tcp 8009 - Apache 日志里有没有
ajp_ilink_receive failed或can't obtain connection—— 这说明后端已拒绝连接,不是代理没配好,是 Tomcat 进程挂了或端口被占
集群里最难调试的,其实是跨机器时间不同步导致 session 失效,或者某台 Tomcat 的 Cluster 配置没开,却指望它参与复制。这些不会报错,只会让负载看起来“不均”或“偶尔丢 session”。










