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

我主要是一个Java开发人员,我向你们提出一个跨越开发人员和系统pipe理员之间分歧的问题。

几年前,当运行Tomcat作为应用程序服务器是一种新奇的事情时,习惯上把它作为Apache的前台。 据我了解,这是因为:

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

Java不再被认为是缓慢的,我怀疑将Apachejoin混合会有助于加快速度。

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

所以我的问题是,这些日子里用Apache面向Java Web应用程序真的有什么好处吗? 如果是这样,阿帕奇还是要走的路? 我应该看看Nginx吗? 如果是的话,我使用的是Glassfish,而不是Tomcat。

由于静态文件,大多数人会说你需要一些内部的东西。

这有点愚蠢,因为:

  • 您可以将Tomcatconfiguration为使用与APR一样的apache
  • 无论如何,您应该使用CDN(内容交付networking)。

真正的原因是你需要tomcat / jetty / jboss的内部负载平衡和处理故障转移。

我build议你不要听“ …… Tomcat引擎是整个生态圈的致命弱点…… ”,因为我们都知道这不是真的……你的数据库和连接池将会是这样的。

这取决于你的应用程序的生态系统。 在Intranet环境中 – 你可能不需要任何东西在Tomcat前面。

如果独自在互联网上作为公众服务,这取决于。 Apache很高兴,因为它提供的模块,如mod_security。 但是如果你不熟悉apache(或者ngix)的configuration,那么你可能会因为configuration错误而使自己面临更多的攻击或者失败点。

在需要升级webapp并等待重新启动的情况下,Apache在前面派上用场,用于服务中断页面。 但是如果重新启动很less,或者计时正确,那么Tomcat就会成为另一个独立的原因。

Tomcat常见问题解答也讨论了这个问题,它解决了一些额外的问题: http : //wiki.apache.org/tomcat/FAQ/Connectors#Q3

由于其多进程特性,Apache不是一个很好的服务静态内容的候选人。 Nginx更适合使用asynchronousI / O来处理请求。 现代雄猫也可以使用asynchronousI / O(Java术语中的NIO)。 例如,您应该在Fedora中安装tomcat-native软件包以使Tomcat使用asynchronousI / O。

令人惊讶的是,这些答案中的一些 – 做你们中的任何一个人实际运行高性能的多层和多服务器Tomcat支持的网站? OP,你原来的猜测是Tomcat不“慢”…哇。 Tomcat引擎是整个生态圈的致命弱点。

是的,你需要在前面的Apache – 它首先提供了mod_rewrite(你是否已经在Tomcat中实现了UrlRewriteFilter?)以及保护web服务器如此重要的htaccess文件。 Apache可以让你负载平衡Tomcat节点,更快地为你的静态内容提供服务,从Tomcat中获得更好的性能,因为你不会使用非Java(js / css / html / jpg / etc)重载请求pipe道。的东西。 您可以轻松卸载Apache的Apache(如果不是在硬件LB上卸载的话),甚至不必处理称为Java Keystore的这个诡计。 只有这么多的胜利 – 你可以调整mod_jk到你的后端节点,以防止超出Java的可怜的小脑袋,因为它通常不能处理一般的Java编码器类的大量stream量。

当心任何告诉你Apache(或者nginx等 – 但是Apache的性能会超过Tomcat,所以没关系)的人在Tomcat面前不是一个好主意。

如果在使用Tomcat时只是绑定特权端口而不是root,则不需要使用Apache httpd。 默认情况下,Tomcat带有需要编译的jsvc

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

我不知道Glassfish,但要确定存在的解决scheme,如果没有,你一定可以使用端口转发技术(iptables等)

我认为用Web服务器(例如Apache httpd)来select应用程序服务器是为了负载均衡,集群或者仅仅通过Web服务器提供静态资源,以及通过应用服务器提供dynamic资源。