我们正在准备从以下环境迁移:
Apache 2.0.2--AJP-->JBoss4.2.2
到
Apache 2.2.3 --???--> JBoss 5.1.0
怎样才能将两者结合在一起呢?
选项包括:
- 经典 AJP(即为 Apache 构建 mod_jk)
- mod_proxy(将 HTTP 请求转发到 JBoss)
- mod_proxy_ajp
选项 2 是目前最流行的解决方案,因为它似乎意味着处理量更少,因为不再需要从 AJP 转换 JBoss 的响应,而 CPU 时间是我们需要密切关注基础设施的方面。选项 2 和 3 也随附了 Red Hat 支持的 Apache 版本。
目前我认为我们不会选择选项 1,因为通过选项 3 我们能够“免费”获得 AJP。
那么,选项 2 和 3 的优缺点是什么?我们真的需要担心 CPU 负载吗?我们在处理二进制数据(AJP 流量)时所损失的带宽和 IO 是否能得到补偿?
我们的基础设施将采用 Apache Fronting取决于9 个经过严格调优的 JBoss(但通常约为这个数字的一半)都位于同一台 RHEL 5 机器上,该机器在私有云中虚拟化。
提前感谢任何指示/建议。
富有的
答案1
2 mod_proxy_http
,除非您需要来自客户端的 Host 标头。
我不推荐经典的 mod_jk,因为它的功能已被 mod_proxy_ajp 取代,而且正如您自己所说,它需要自己构建和维护该模块。
我认为 mod_proxy_http 是一个非常干净的解决方案,它取代了 ajp。但是,您应该注意从 ajp 移到 http 的一些注意事项。如果您需要访问与 apache 收到的完全相同的服务器标头(包括 Host 标头),则应使用 ajp。JBoss 将看到来自 apache 而不是原始客户端的新 http 请求。如果您只需要客户端的远程 IP,您仍然可以通过 apache 可以在新请求上设置的特殊标头来获取它。但是,如果您从应用程序层进行虚拟托管,最好使用 ajp。
就性能而言,ajp 或 http 都需要 JBoss 进行一些处理和一些本地套接字 TCP 流量。您必须尝试两者才能知道哪个更有效,但我认为总体而言,它只占服务器总负载的很小一部分。Http 是一种更复杂的协议,而 ajp 专门设计用于在 Web 层和应用层之间高效运行,因此理论上 ajp 可能更好。话虽如此,我发现在 Tomcat 应用服务器系列之外,http 通常会得到更好的支持。
我使用 mod_proxy_ajp 和 mod_proxy_http,没有遇到任何问题。