为啥在 Glassfish 或 Tomcat 前使用 Apache Web Server?
Posted
技术标签:
【中文标题】为啥在 Glassfish 或 Tomcat 前使用 Apache Web Server?【英文标题】:Why use Apache Web Server in front of Glassfish or Tomcat?为什么在 Glassfish 或 Tomcat 前使用 Apache Web Server? 【发布时间】:2011-07-04 14:06:07 【问题描述】:在 GF 或 Tomcat 前使用 Apache Webserver 是个好主意吗?它是否提高了性能/安全性?
或者没有任何理由将 Apache Web Server 与 GF 一起使用?
【问题讨论】:
如果你在做 Comet/Websockets,不要把 Apache 放在前面。看我的回答。 【参考方案1】:取自https://cwiki.apache.org/confluence/display/TOMCAT/Connectors#Connectors-Q3
集群。通过使用 Apache HTTP 作为前端,您可以让 Apache HTTP 充当您的内容到多个 Apache Tomcat 实例的前门。如果您的 Apache Tomcat 之一发生故障,Apache HTTP 会忽略它,您的系统管理员可以彻夜难眠。如果您使用硬件负载均衡器和 Apache Tomcat 的集群功能,则可以忽略这一点。 集群/安全。您还可以将 Apache 用作不同 URL 命名空间(/app1/、/app2/、/app3/ 或虚拟主机)的不同 Apache Tomcat 的前门。然后,Apache Tomcat 可以每个都在受保护的区域中,从安全的角度来看,您只需要担心 Apache HTTP 服务器。从本质上讲,Apache 变成了一个智能代理服务器。 安全。这个话题可以左右任何一种方式。 Java 有安全管理器,而 Apache 在安全方面有更大的思想份额和更多的技巧。我不会更详细地讨论这个,但让谷歌成为你的朋友。根据您的情况,一个可能比另一个更好。但也请记住,如果您使用 Tomcat 运行 Apache - 您需要保护两个系统,而不是一个。 附加组件。添加 CGI、perl、php 对 Apache 来说非常自然。对于Tomcat来说,它的速度更慢,更像是一个杂物。 Apache HTTP 还有数百个模块可以随意插入。 Apache Tomcat 可以有这个能力,但是代码还没有写出来。 装饰师!在 Apache Tomcat 前面使用 Apache HTTP,您可以执行 Apache Tomcat 不支持或没有即时代码支持的任意数量的装饰器。例如,可以为 Apache Tomcat 编写 mod_headers、mod_rewrite 和 mod_alias,但既然 Apache HTTP 做得这么好,为什么还要重新发明***呢? 速度。 Apache HTTP 在提供静态内容方面比 Apache Tomcat 更快。但除非你有一个高流量的网站,否则这一点是没有用的。但在某些情况下,Apache Tomcat 可以比 Apache httpd 更快。因此,对您的网站进行基准测试。 Apache Tomcat 可以在使用适当的连接器(启用了 sendFile 的 APR)时以 httpd 速度执行。在 Apache httpd 和 Tomcat 之间进行选择时,不应考虑速度 套接字处理/系统稳定性。 Apache HTTP 在错误条件方面比 Apache Tomcat 具有更好的套接字处理能力。主要原因是 Apache Tomcat 必须通过需要跨平台的 JVM 执行其所有套接字处理。问题是套接字优化是特定于平台的考验。大多数情况下,java 代码都很好,但是当您还被丢弃的连接、无效的数据包、来自无效 IP 的无效请求轰炸时,Apache HTTP 在删除这些错误条件方面比基于 JVM 的程序做得更好。 (YMMV)【讨论】:
与 GlassFish 无关,还是我们假设的答案相同?【参考方案2】:既然每个人都给了你为什么将 Apache 放在 Tomcat 前面的理由,那么让我给你一些不的理由:
The AJP connector does not and will not support advanced IO 表示没有 Comet、Websockets 等 如果您不使用 AJP,我注意到在为 Apache 使用 mod_proxy 时会产生相当大的代理开销。因此,如果您正在寻找低延迟的 Apache,前面的就不好了。 与 nginx 或 Lighttpd 等相比,Apache 占用的空间相当大。把 Apache 放在前面确实不:
提高性能。 Tomcat will run just as fast as Apache (in some cases faster) with APR。 提高安全性。我认为我从未见过 Tomcat 存在真正的安全问题。我不知道这个 BS 是从哪里来的,Tomcat 的安全性不如 Apache。Apache 为您提供的是更多插件,并允许您运行不同的 Web 技术。
如果您只需要 Tomcat,您会更适合使用 HAProxy 或 Nginx 作为负载平衡器。
【讨论】:
Tomcat 7 支持 AJP 连接器的 NIO(请参阅 tomcat.apache.org/tomcat-7.0-doc/config/ajp.html),尽管仍标记为实验性。 @Bob 虽然该文档似乎显示 NIO 支持 7.0 这个文档,但它仍然不支持:tomcat.apache.org/tomcat-7.0-doc/aio.html。但是您可能是对的,这可能只是一个文档错误。 @Bob ***.com/questions/10536718/…【参考方案3】:可扩展性 - 正如 Amir 和 user384706 所指出的,您可以在 Apache 后面对应用程序的多个实例进行负载平衡。这将使您能够处理更多的流量,并在您的一个实例出现故障时提高稳定性。
安全性 - Apache、Tomcat 和 Glassfish 都支持 SSL,但如果您决定使用 Apache,那么您很可能应该在其中配置它。如果您想要额外的攻击防护(DoS、XSS、SQL 注入等),您可以安装mod_security Web 应用防火墙。
其他功能 - Apache 有许多不错的模块可用于 URL 重写、与其他编程语言的接口、身份验证以及大量其他内容。
性能 - 如果您有很多静态内容,使用 Apache 提供它会提高您的性能。如果您的大部分内容是动态的,那么单独使用 Tomcat 或 Glassfish 将同样快(可能更快)。 (正如this question 的答案所指出的那样,这不再是真的了。)
【讨论】:
其实静态内容的性能差异可以忽略不计,见***.com/questions/654701/…【参考方案4】:将 Apache 放在 Tomcat 前面的一个原因是为了负载平衡。 请求先到达 Apache 服务器,然后根据负载和可用性分发到后端 Tomcat 容器。 客户端只知道一个 IP (Apache),但请求分布在多个容器上。 因此,如果您部署了一种分布式 Web 应用程序并且您需要它的健壮性。 如果您的问题是关于一个简单的 Web 应用程序,那么请参阅 dbyrne 答案
【讨论】:
【参考方案5】:如果您正在运行 LAMP 堆栈,您可以从 apache 运行 PHP/Ruby 的东西,并使用 mod_jk 将 java 的东西转发到 tomcat。
【讨论】:
以上是关于为啥在 Glassfish 或 Tomcat 前使用 Apache Web Server?的主要内容,如果未能解决你的问题,请参考以下文章
Web Sockets + Tomcat/Glassfish + 集群 + 负载平衡 - 都有哪些选项?
Jetty,Tomcat,Nginx,Geronimo,Glassfish:我很困惑
RESTful json 响应在 tomcat 上失败,但在 GlassFish 中有效
无法通过 tomcat 中的 websocket 发送二进制消息,但可以在 glassfish 中使用。使用 IllegalArgumentException 在 tomcat 中失败