是否真的有必要将 Apache 作为 Glassfish/JBoss/Tomcat 的前端运行?

是否真的有必要将 Apache 作为 Glassfish/JBoss/Tomcat 的前端运行?

我主要是一名 Java 开发人员,我向您提出一个跨越开发人员和系统管理员之间界限的问题。

几年前,当将 Tomcat 作为应用服务器运行还是一件新鲜事时,人们习惯于将其置于 Apache 的前端。据我了解,这样做是因为:

  1. Java 被认为“缓慢”,而让 Apache 直接提供静态内容则很有帮助。
  2. 除非以 root 身份运行,否则 Tomcat 无法监听端口 80/443,这很危险。

Java 不再被认为是缓慢的,并且我怀疑添加 Apache 是否真的有助于加快速度。

至于端口问题,现在可能有更简单的方法将应用服务器连接到端口 80/443。

所以我的问题是 - 如今使用 Apache 来处理 Java Webapps 真的有什么好处吗?如果是这样,Apache 仍然是可行的方法吗?我应该看看 Nginx 吗?如果这很重要的话,我会使用 Glassfish 而不是 Tomcat。

答案1

大多数人会说,由于静态文件,所以需要先在前面放一些东西。

这有点愚蠢,因为:

  • 您可以使用 APR 配置 Tomcat 使用与 apache 相同的 IO
  • 无论如何,您都应该使用 CDN(内容分发网络)。

您需要在 tomcat/jetty/jboss 前面安装某些东西来平衡负载并处理故障转移的真正原因。

我建议你不要听“...Tomcat引擎是整个生态圈的致命弱点...“众所周知,事实并非如此……您的数据库及其连接池就是这样。

答案2

这取决于您应用周围的生态系统。在内部网环境中 - 您可能不需要在 Tomcat 前面添加任何东西。

如果单独在互联网上作为面向公众的服务,则视情况而定。Apache 很好,因为它提供了 mod_security 等模块。但是,如果您不了解 apache(或 ngix)的配置 - 那么您可能会因配置错误而遭受更多攻击或出现故障点。

在您需要升级 Web 应用并等待重启的情况下,Apache 可以方便地提供中断页面。但如果重启次数很少或时间安排正确,那么这也是使用独立 Tomcat 的另一个原因。

Tomcat FAQ 也讨论了这个问题并且提出了一些额外的观点: http://wiki.apache.org/tomcat/FAQ/Connectors#Q3

答案3

令人惊讶的是,这些答案中的一些 - 你们当中有人真的运行高性能多层和多服务器 Tomcat 支持的网站吗?OP,你最初假设 Tomcat 并不“慢”......哇。Tomcat 引擎是整个生态圈的致命弱点。

是的,您需要 Apache 作为前端 - 它首先提供 mod_rewrite(您已经在 Tomcat 中实现了 UrlRewriteFilter 吗?)以及 htaccess 文件,这使得保护 Web 服务器变得如此重要。Apache 可让您在其后面平衡 Tomcat 节点的负载,更快地提供静态内容,并获得更好的Tomcat 的性能会降低,因为您不会用非 Java(js/css/html/jpg/等)内容超载其请求管道。您可以轻松地在 Apache 上卸载 SSL(如果不在硬件 LB 上卸载),甚至不必处理称为 Java Keystore 的那个闹剧。好处太多了 - 您可以将 mod_jk 调整到后端节点,以避免 Java 可怜的小脑袋超载,因为它通常无法处理普通 Java 编码器类的大量流量。

当心有人告诉你 Apache(或 nginx 等 - 但 Apache 的性能无论如何都会胜过 Tomcat,所以这并不重要)在 Tomcat 面前不是一个好主意。

答案4

如果在使用 Tomcat 时只需要绑定特权端口而无需 root 身份,则无需在其前面安装 Apache httpd。默认情况下,Tomcat 附带了jsvc您需要编译的 Apache httpd。

jsvc是一个 Java 服务包装器,用于将 Tomcat 作为服务启动。此服务以 root 身份启动,但以普通用户身份启动 Tomcat。因此,您可以将 Tomcat 绑定到特权端口。

我不知道 Glassfish,但请确保存在解决方案,如果不存在,您肯定可以使用端口转发技术(iptables 等...)

我认为选择将 Web 服务器(例如 Apache httpd)置于应用程序服务器的前端是为了实现负载平衡、集群,或者仅使用 Web 服务器提供静态资源,使用应用程序服务器提供动态资源。

相关内容