为啥在 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 表示没有 CometWebsockets 等 如果您不使用 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 + 集群 + 负载平衡 - 都有哪些选项?

glassfish v3 vs tomcat 7 [关闭]

Jetty,Tomcat,Nginx,Geronimo,Glassfish:我很困惑

RESTful json 响应在 tomcat 上失败,但在 GlassFish 中有效

无法通过 tomcat 中的 websocket 发送二进制消息,但可以在 glassfish 中使用。使用 IllegalArgumentException 在 tomcat 中失败

有没有办法只在 Tomcat/Wildfly/Glassfish 启动时运行方法/类?