为什么在Glassfish或Tomcat前使用Apache Web Server?

在GF或Tomcat前面使用Apache Webserver是否好主意? 它是否提高了性能/安全性?

或者没有任何理由使用GF的Apache Web服务器?

取自http://wiki.apache.org/tomcat/FAQ/Connectors#Q3

  • 集群。 通过使用Apache HTTP作为前端,您可以让Apache HTTP作为您的内容的前门,将其转发给多个Apache Tomcat实例。 如果其中一个Apache Tomcats发生故障,Apache HTTP将忽略它,并且您的系统pipe理员可以通宵rest。 如果使用硬件负载均衡器和Apache Tomcat的集群function,则可以忽略这一点。
  • 聚类/安全。 您也可以使用Apache作为不同的Apache Tomcat的不同URL名称空间(/ app1 /,/ app2 /,/ app3 /或虚拟主机)的前门。 Apache Tomcat随后可以分别位于受保护的区域,从安全的angular度来看,您只需要担心Apache HTTP服务器。 基本上,Apache成为一个智能的代理服务器。
  • 安全。 这个话题可以左右摇摆。 Java拥有安全pipe理员,而Apache在安全方面拥有更多的思想和更多的技巧。 我不会更详细地讨论这个问题,但让Google成为你的朋友吧。 根据你的情况,一个可能比另一个好。 但是请记住,如果你使用Tomcat来运行Apache,那么你有两个系统来防御,而不是一个。
  • 附加组件。 加上CGI,perl,PHP对Apache来说是非常自然的。 它更慢,更多的是对Tomcat的混乱。 Apache HTTP也有数百个可以随意插入的模块。 Apache Tomcat可以拥有这种能力,但代码还没有写完。
  • 装饰! 使用Apache Tom在Apache Tomcat之前,可以执行Apache Tomcat不支持的任何数量的装饰器,或者不具有立即的代码支持。 例如,可以为Apache Tomcat编写mod_headers,mod_rewrite和mod_alias,但是为什么在Apache HTTP做得这么好的时候重新发明轮子呢?
  • 速度。 Apache HTTP在提供静态内容方面比Apache Tomcat更快。 但是除非你有一个高stream量的网站,这一点是没有用的。 但在某些情况下,Apache Tomcat可能比Apache httpd更快。 所以基准你的网站。 当使用正确的连接器(启用sendFile的APR)时,Apache Tomcat可以以httpd速度执行。 在Apache httpd和Tomcat之间select速度不应该被视为一个因素
  • 套接字处理/系统稳定性。 与Apache Tomcat相比,Apache HTTP在错误条件方面具有更好的套接字处理能力。 主要原因是Apache Tomcat必须通过需要跨平台的JVM执行其所有的套接字处理。 问题是套接字优化是一个平台特定的考验。 大多数情况下,java代码是正常的,但是当你也被丢弃的连接,无效的数据包,无效IP的无效请求轰炸时,Apache HTTP在比基于JVM的程序丢弃这些错误条件方面做得更好。 (YMMV)

既然每个人都给了你为什么要把Apache放在Tomcat前面的理由,让我给你一些理由不要

  • AJP连接器不支持高级IO,意味着没有CometWebsockets
  • 如果你不使用AJP,我注意到在Apache中使用mod_proxy时,会有相当大的代理开销。 所以如果你在寻找低延迟的Apache在前面会不太好。
  • 与Nginx或Lighttpd等相比,Apache有一个相当大的尺寸

把Apache放在前面并不是

  • 提高性能。 使用APR,Tomcat的运行速度与Apache相同(在某些情况下速度更快) 。
  • 提高安全性。 我不认为我曾经见过Tomcat真正的安全问题。 我不知道这个BS来自哪个Tomcat比Apache更安全。

Apache提供给你的是更多的插件,并允许你运行不同的networking技术。

如果你只需要Tomcat,你会更适合使用HAProxy或Nginx作为负载平衡器。

  • 可伸缩性 – 正如Amir和user384706指出的那样,您可以在Apache后面平衡多个应用程序实例。 这将允许您处理更多的音量,并在您的实例发生故障时提高稳定性。

  • 安全性 –Apache,Tomcat和Glassfish都支持SSL,但是如果你决定使用Apache,那么最有可能的就是你应该configuration的地方。 如果您需要额外的防御攻击(DoS,XSS,SQL注入等),则可以安装mod_security Web应用程序防火墙。

  • 其他function – Apache有一堆很好的模块可用于URL重写,与其他编程语言接口,身份validation和其他许多东西。

  • 性能 – 如果你有很多静态内容,使用Apache服务将会提高你的性能。 如果您的大部分内容都是dynamic的,则单独使用Tomcat或Glassfish将会同样快(可能更快)。 (正如这个问题的答案所指出的那样,这不再是真的)。

将Apache放在Tomcat之前的一个原因是负载均衡。
请求击中前面的Apache服务器,并根据负载和可用性分发到后端Tomcat 容器
客户端只知道一个IP(Apache),但这些请求分布在多个容器中。
所以在这种情况下,你部署了一种分布式的Web应用程序,你需要它强大的。
如果你的问题是关于一个简单的Web应用程序,然后看到dbyrne答案

如果你正在运行一个LAMP堆栈,你可以运行PHP / Ruby的东西closuresApache并转发到Tomcat的mod_jk的东西。