Tomcat 7与mod_jk

我在十字路口决定是否使用mod_jk或mod_proxy设置Apache 2和Tomcat 7的负载平衡系统。我读了通常的比较,mod_jkfunction更强大但configuration困难等,但我读的是有点过时(2007 – 2010年),根据我目前的要求,我可以去任何一种方式。

现在看看连接器上的Tomcat 7文档! 我发现,除了mod_proxy之外,他们基本上都弃用了:

其他支持AJP的本机连接器可能工作,但不再支持。

那么这是否意味着新的用途应该与mod_proxy一起使用?

mod_proxy是Apache HTTP服务器模块,而不是Apache Tomcat模块。

这个页面所说的是,Tomcat支持JK1.2或Apache HTTP中的mod_proxy模块提供的AJP协议。

历史上你所要做的就是使用mod_jk为Apache HTTP服务器提供AJP1.3支持,就像现在在mod_proxy模块中提供的Apache HTTP 2.2一样 – 参见http://httpd.apache.org/docs/2.2/ mod / mod_proxy.html其中规定:

这个模块实现了Apache的代理/网关。 它实现了AJP13(Apache JServe协议版本1.3),FTP,CONNECT(用于SSL),HTTP / 0.9,HTTP / 1.0和HTTP / 1.1的代理function。

这给了你几个select:

  1. 使用Tomcat中的HTTP连接器,让terminal客户端直接连接到这个连接器。
  2. 使用Tomcat中的HTTP连接器,并通过HTTP mod_proxy HTTP代理function进行代理。
  3. 在Tomcat中使用AJP1.3连接器,并通过HTTP mod_proxy AJP代理function进行代理。
  4. 在Tomcat中使用AJP1.2连接器,并使用Apache中的HTTP mod_jk AJP模块连接到此连接器。

我的build议是select3。

有关在Apache中configuration此信息的特定页面是http://httpd.apache.org/docs/2.2/mod/mod_proxy_ajp.html

多年来,已经有许多连接器被开发来使Apache httpd能够与使用了各种协议的Tomcat进行通信。 当在网上search有关如何做到这一点的信息时,偶然发现一些非常糟糕的,过时的build议。 所以首先你应该考虑的唯一select是:

  • mod_jk的
  • mod_proxy_http
  • mod_proxy_ajp的

所有其他的选项都没有得到多年的支持,所以你应该避免mod_jk2,mod_jserv,mod_webapp以及其他在这里没有讨论过的模块。 目前有三项支持,都是积极发展的。

我在为$ work提供支持方面的经验是,现在一个典型的客户在mod_proxy_ajp中比在mod_jk或mod_proxy_http中更容易出错。 (几年前mod_proxy_ajp还不成熟,但是现在我没有看到任何区别。)

这带来了一个紧迫的问题:HTTP(mod_proxy_http)或AJP(mod_proxy_ajp或mod_jk)? 而答案呢? 这取决于! 两个协议都有其优点和缺点。 哪一个适合你,取决于你的情况。 通常影响这个select的因素是:

  • 一个协议/模块是否已经被使用?
  • httpd和Tomcat之间的通信是否需要encryption?
  • httpdterminalSSL,但SSL信息需要传递给Tomcat?

如果您已经在使用mod_jk,mod_proxy_http或mod_proxy_ajp,并且它符合您的所有要求,那么不太可能有一个很好的理由来改变它。 坚持使用你现在使用的并且在你的httpd实例中保持一致性会更好。

如果您需要encryptionhttpd和Tomcat之间的通信,那么使用mod_proxy_http可以显着简化,因为您只需从http切换到https协议即可。 mod_jk和mod_proxy_ajp使用不支持encryption的AJP协议,因此您必须通过SSH隧道,IPSec或类似的协议单独实现。 这会给httpd-Tomcat通信通道增加很多configuration复杂性。

在httpd终止SSL的时候,提供SSL属性是暴露的(两个简单的指令),那么mod_jk和mod_proxy_ajp会自动将这些信息传递给Tomcat,而Tomcat可以让Web应用程序不需要任何额外的configuration。 要获得与mod_proxy_http相同的结果,需要将httpdconfiguration为将SSL信息添加为http标题,并且需要在Tomcat中configurationValve以提取此信息并使其可用于Web应用程序。 因此,使用mod_proxy_http可以使Tomcat的SSL信息更复杂一些。

mod_jk和mod_proxy_ *也有非常不同的configuration样式。 mod_proxy_ *指令与其他httpd指令一致,而mod_jk使用外部属性文件。 对于熟悉httpd的系统pipe理员来说,mod_jk方法看起来有些奇怪。

综上所述:

  • 如果需要将httpdencryption到Tomcat通道,请使用mod_proxy_http
  • 如果您需要将SSL信息公开给您的Web应用程序,请使用mod_jk或mod_proxy_ajp
  • 如果您已经在使用这些模块之一,那么更改可能会导致比保存更多的麻烦
  • 给定一个完全自由的select,我会使用mod_proxy_http只是因为configuration与其他httpd模块更一致,使用Wiresharkdebugging稍微容易一些,它可以使用Tomcat中现有的HTTP连接器。

另请参阅我写的演示文稿( http://people.apache.org/~markt/presentations/2012-10-Apache-Tomcat-Reverse-proxies.pdf )和Rainer Jung对演示文稿的其他评论( http:// people .apache.org /〜markt / presentations / 2012-10-Apache-Tomcat-Reverse-proxies-notes-rjung.txt )