Apache 和 Tomcat 直接集成与通过 AJP 连接性能区别

文章导读
Apache 和 Tomcat 集成时,AJP 协议使用二进制通信效率略高但消耗更多系统资源,HTTP 协议灵活性更好且更通用。除非有明确性能瓶颈且固定架构,否则推荐优先使用 HTTP 协议进行代理整合。
📋 目录
  1. 快速配置思路
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Apache 和 Tomcat 集成时,AJP 协议使用二进制通信效率略高但消耗更多系统资源,HTTP 协议灵活性更好且更通用。除非有明确性能瓶颈且固定架构,否则推荐优先使用 HTTP 协议进行代理整合。

先说结论:AJP 协议在特定场景下可能提升约 20% 运行效率,但 HTTP 协议在通用性和维护性上更优。

  • 适合:高并发且前端代理服务器固定的内部集群环境
  • 重点看:系统资源消耗与协议灵活性之间的权衡
  • 别忽略:若考虑未来更换前端代理服务器,HTTP 协议是更好的选择

快速配置思路

配置核心在于 Tomcat 的 server.xml 连接器设置与 Apache 的代理模块加载,两者需端口与协议一致。

Tomcat 端配置(server.xml):

<!-- AJP 协议配置示例 -->
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
<!-- HTTP 协议配置示例 -->
<Connector port="8090" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

Apache 端配置(httpd.conf 或 vhosts):

# 加载代理模块
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_http_module modules/mod_proxy_http.so

# AJP 代理示例
ProxyPass /jsp ajp://localhost:8010/test_apache/
ProxyPassReverse /jsp ajp://localhost:8010/test_apache/

# HTTP 代理示例
ProxyPass / balancer://test/
BalancerMember http://localhost:8090/

为什么会这样

协议底层编码方式不同导致性能与资源消耗的差异。AJP 使用二进制进行通信,拥有极高的效率,同时也会耗费更多的系统资源;HTTP 使用超文本与 Tomcat 通信,效率略差,但是灵活性更高。

Apache 是 Web 服务器,侧重静态解析和 HTTP 服务;Tomcat 是 Java 应用服务器,侧重 Servlet 和 JSP 动态解析。两者整合时,Apache 作为反向代理将动态请求转发给 Tomcat。AJP 协议专为应用服务器通信设计,减少了 HTTP 协议解析的开销,但牺牲了通用性。

Apache 和 Tomcat 直接集成与通过 AJP 连接性能区别

分步处理

第一步:确认 Tomcat 连接器状态

检查 Tomcat 安装目录 conf/server.xml 文件,确认是否启用了 AJP 或 HTTP Connector。默认情况下 Tomcat 可能启用 AJP 端口 8009。

第二步:配置 Apache 代理模块

在 Apache 配置文件中加载 mod_proxy 相关模块。若使用 AJP,需加载 mod_proxy_ajp.so;若使用 HTTP,需加载 mod_proxy_http.so。确保 Apache 版本支持相应模块,2.2.x 及以上版本对 mod_proxy 功能增强较多。

第三步:设置虚拟主机转发规则

在 httpd-vhosts.conf 中配置 ProxyPass 指令。注意 AJP 代理端口需与 Tomcat 的 AJP 端口一致,HTTP 代理地址需与 Tomcat 的 HTTP 端口一致。配置完成后重启 Apache 服务。

Apache 和 Tomcat 直接集成与通过 AJP 连接性能区别

第四步:回滚准备

修改配置前备份 server.xml 和 httpd.conf。若切换协议后出现连接拒绝,检查防火墙是否放行对应端口,以及 Tomcat 是否成功监听该端口。

怎么验证是否生效

检查连接状态:使用 netstat 命令查看服务器端口监听情况,确认 Tomcat 已监听配置的 AJP 或 HTTP 端口。

查看访问日志:检查 Apache 的 access_log 和 Tomcat 的 localhost_access_log,确认请求是否成功转发且状态码为 200。

性能对比测试:在相同负载下,分别记录 AJP 和 HTTP 模式的响应时间。部分技术资料提到,根据经验 AJP 大约可以提高 20% 的运行效率,但实际效果需结合具体业务场景验证。

常见坑

粘性会话支持:AJP 代理支持负载均衡和粘性会话(sticky session),而 HTTP 代理在某些配置下可能不支持粘性会话或需要额外测试验证。

Apache 和 Tomcat 直接集成与通过 AJP 连接性能区别

资源消耗增加:开启 AJP 协议虽然效率较高,但会耗费更多的系统资源,需监控服务器内存和 CPU 使用情况。

架构灵活性:如果考虑到以后更换前端代理服务器,不要使用 AJP 协议,HTTP 协议可能是最好的选择,因为更通用。

端口冲突:确保配置的 AJP 或 HTTP 端口未被其他程序占用,Tomcat 默认 AJP 端口通常为 8009,HTTP 端口通常为 8080。

常见问题

AJP 和 HTTP 协议哪个更安全?

HTTP 协议更通用且易于通过标准 Web 安全设备防护。AJP 协议设计用于内部通信,不建议直接暴露在公网,应限制仅允许 Apache 服务器访问 Tomcat 的 AJP 端口。

Apache 和 Tomcat 整合能提升多少性能?

公开资料中没有看到可靠的量化数据表明整合本身能提升具体百分比性能。整合的主要目的是动静分离,减少 Tomcat 处理静态资源的开销,从而间接提升整体服务能力。

Tomcat 可以独立运行吗,必须配 Apache 吗?

Tomcat 可以独立于 Apache 运行。Tomcat 本身支持 HTTP 协议和静态文件处理,但对于高并发静态资源处理效率不如 Apache,整合使用可减少 Tomcat 的服务开销。

参考来源

  • Apache + Tomcat + ajp 协议配置(2024 年 8 月 27 日发布)
  • 一文看懂 Apache 和 Tomcat 有哪些区别详解。附本地内网 web 服务器网址无公网 ip 直接端口映射外网访问简便方案
  • Tomcat 8(十)HTTP/AJP Connector、Bio/Nio/Apr 性能对比(2017 年 2 月 13 日发布)
  • 采用 ajp 代理模式配置 Apache+tomcat 实现负载均 (附件中具有详细配置)(2015 年 1 月 12 日撰)
  • Apache 与 Tomcat 整合实现动静分离与负载均衡的配置实践(2014 年 9 月 8 日信息)