【问题标题】: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 放在前面。看我的回答。

标签: apache tomcat glassfish


【解决方案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 放在前面确实

Apache 为您提供的是更多插件,并允许您运行不同的 Web 技术。

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

【讨论】:

【解决方案3】:
  • 可扩展性 - 正如 Amir 和 user384706 所指出的,您可以在 Apache 后面对应用程序的多个实例进行负载平衡。这将使您能够处理更多的流量,并在您的一个实例出现故障时提高稳定性。

  • 安全性 - Apache、Tomcat 和 Glassfish 都支持 SSL,但如果您决定使用 Apache,那么您很可能应该在其中配置它。如果您想要额外的攻击防护(DoS、XSS、SQL 注入等),您可以安装mod_security Web 应用防火墙。

  • 其他功能 - Apache 有许多不错的模块可用于 URL 重写、与其他编程语言的接口、身份验证以及大量其他内容。

  • 性能 - 如果您有很多静态内容,使用 Apache 提供它会提高您的性能。如果您的大部分内容是动态的,那么单独使用 Tomcat 或 Glassfish 将同样快(可能更快)。 (正如this question 的答案所指出的那样,这不再是真的了。)

【讨论】:

【解决方案4】:

将 Apache 放在 Tomcat 前面的一个原因是为了负载平衡。
请求先到达 Apache 服务器,然后根据负载和可用性分发到后端 Tomcat 容器
客户端只知道一个 IP (Apache),但请求分布在多个容器上。
因此,如果您部署了一种分布式 Web 应用程序并且您需要它的健壮性。
如果您的问题是关于一个简单的 Web 应用程序,那么请参阅 dbyrne 答案

【讨论】:

    【解决方案5】:

    如果您正在运行 LAMP 堆栈,您可以从 apache 运行 PHP/Ruby 的东西,并使用 mod_jk 将 java 的东西转发到 tomcat。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-20
      • 2010-10-20
      • 2023-03-29
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 2010-09-15
      相关资源
      最近更新 更多