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


14

我主要是Java开发人员,因此遇到一个问题,跨越了开发人员和sysadmins之间的鸿沟。

几年前,当将Tomcat作为应用服务器运行是一种新颖的事物时,通常将其与Apache一起使用。据我了解,这样做是因为:

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

Java不再被认为是缓慢的,我怀疑将Apache添加到该组合中实际上将有助于加快处理速度。

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

因此,我的问题是-如今,将Java Webapp与Apache一起使用真的有任何好处吗?如果是这样,Apache仍然是要走的路吗?我应该看看Nginx吗?如果重要的话,我使用的是Glassfish,而不是Tomcat。

Answers:


8

大多数人会说因为静态文件,您需要前端的东西。

这有点愚蠢,因为:

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

真正的原因是您需要tomcat / jetty / jboss前面的东西来进行负载平衡和处理故障转移。

我建议您不要听“ ……Tomcat引擎是整个生态圈的致命弱点…… ”,因为我们都知道那是不对的……您的数据库及其连接池就是那样。


亚当,您在跟踪我从StackOverflow到Serverfault吗?:-)我同意您的答复。回想起来,我应该用更好的措辞来表达问题,以反映实际情况:由于数据库几乎涉及任何页面命中,因此静态内容很少说。目前(非常早期的初创企业探索)我们不需要负载平衡,但是幸运的是,我们将来会需要它。
咖啡因昏迷

@Caffeine Coma我在同一条船上,似乎我们使用的是相同的技术,因此在Stackexchanges上处于同一线程上具有偶然性(我发誓我不会跟踪:))。顺便说一句,我们正在使用Nginx + Tomcat。
亚当·根特

5

这取决于您应用程序周围的生态系统。在Intranet环境中-Tomcat之前可能不需要任何东西。

如果仅将互联网作为面向公众的服务,则取决于情况。Apache之所以出色,是因为它提供了类似于mod_security的模块。但是,如果您不了解apache(或ngix)的配置-那么您可能会因配置错误而遭受更多的攻击或失败。

如果需要升级Webapp并等待重新启动,则前面的Apache可以方便地提供中断页面。但是,如果重启很少或它们的定时正确-那么这是使Tomcat独立运行的另一个原因。

Tomcat FAQ也确实讨论了这一问题,它解决了一些其他问题:http : //wiki.apache.org/tomcat/FAQ/Connectors#Q3


1

由于Apache具有多进程特性,因此不是提供静态内容的理想选择。Nginx更适合,因为它使用异步I / O处理请求。现代Tomcat也可以使用异步I / O(Java术语中的NIO)。例如,您应该tomcat-native在Fedora中安装软件包,以使Tomcat使用异步I / O。


无论如何,我实际上并没有提供太多静态内容。我的问题确实是:我是否需要打扰Apache / Nginx前端,还是直接使用Glassfish?谢谢。
咖啡因昏迷

实际上,问题不仅仅限于提供静态内容,因为如果服务器不使用连接速度慢的异步I / O客户端,则会阻塞服务器的执行线程,直到它们的内容全部填满。因此,无论如何,拥有AIO驱动的前端都是有好处的。但是,正如我已经提到的,Tomcat具有AIO功能。我认为现有的Glassfish软件包中已经包含AIO库,因此您可能不必理会。
亚历克斯(Alex)

apache不一定是多进程的。mpm worker已经停产了一段时间httpd.apache.org/docs/2.2/mod/worker.html,我们正在生产环境中使用多线程Web服务器。
Dialt0ne 2011年

好了,多线程Apache仍然使用同步I / O。如果慢的客户端将线程而不是进程阻塞在套接字上,我看不出太大的区别。Nginx被设计为单线程单进程有限状态机(嗯,不是必需的单进程,应将进程数设置为多核系统上的CPU内核数)。
亚历克斯(Alex)

1

令人惊讶的是,其中一些答案-你们中的任何人实际上是否在运行高性能的多层和多服务器Tomcat支持的网站?OP,您最初的假设是Tomcat不“慢”……哇。Tomcat引擎是整个生态圈的致命弱点。

是的,您想要Apache在前面-它首先提供了mod_rewrite(您是否已经在Tomcat中实现了UrlRewriteFilter?)以及htaccess文件,这些文件使保护Web服务器变得非常重要。Apache可以使您在其背后的Tomcat节点之间实现负载平衡,更快地提供静态内容,并从Tomcat中获得更好的性能,因为您不会使用非Java(js / css / html / jpg / etc。)来超载它的请求管道。东西。您可以轻松地在Apache上卸载SSL(如果不在硬件LB上卸载),甚至不必处理称为Java Keystore的麻烦。有这么多的胜利-您可以将mod_jk调整到您的后端节点,以防止超出Java的可怜的小脑筋,因为它通常无法用一般的Java编码器来处理大量流量。

当心任何告诉您Apache(或nginx等-但Apache的性能无论如何都会使Tomcat胜过Tomcat,因此这无关紧要)的人在Tomcat之前并不是一个好主意。


4
你听起来很生气。
咖啡因昏迷

只是令人反感,人们在ServerFault上提供了如此糟糕的建议。

提防任何大声疾呼支持此类主张的人。如果您的网站大部分是动态的,那么直接tomcat将会更快。如今,大多数流量大的站点使用CDN(内容交付网络)来获取其静态内容,因此没有理由使用Apache来提供您的静态内容。话虽如此,您仍然应该对负载平衡/ ssl有所了解。
亚当·根特

0

如果使用Tomcat时只是绑定特权端口而不是root用户,则无需在Apache httpd前面加上它。默认情况下,Tomcat附带了jsvc您需要编译的Tomcat 。

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

我不了解Glassfish,但请确保存在解决方案,如果没有解决方案,则可以确定使用端口转发技术(iptables等)。

我认为选择将应用程序服务器与Web服务器(例如Apache httpd)一起放置是为了实现负载平衡,群集化,或者仅通过Web服务器提供静态资源,而通过应用程序服务器提供动态资源。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.