我应该自己运行Tomcat还是运行Apache + Tomcat?

时间:2012-09-09 21:35:02

标签: apache tomcat

我想知道将Tomcat作为Web服务器和容器运行是否可行?另一方面,似乎扩展webapp的正确方法是在端口80上使用Apache HTTP侦听并将其连接到另一个端口上侦听Tomcat? 两种方式都可接受吗?现在用的是什么?什么是主要区别?大多数主要网站如何解决这个问题?

感谢。

2 个答案:

答案 0 :(得分:14)

出于多种原因,将Apache(或任何其他网络服务器)放置在应用程序服务器(Tomcat)前是一件好事。

首先考虑的是静态资源和缓存。

Tomcat可能也会提供很多静态内容,甚至在动态内容上它会向浏览器发送一些缓存指令。但是,每次首次命中tomcat的浏览器都会导致tomcat发送静态文件。由于在Tomcat中处理请求比在Apache中处理要贵一些(因为Apache是​​超级优化的并且利用了Tomcat中并不总是可用的非常低级别的东西,因为Tomcat从请求中提取了比Apache需要的更多信息等等。 ..),静态文件可能更适合Apache服务器。

然而,由于配置Apache以提供部分内容而Tomcat用于其余部分或URL空间是一项艰巨的任务,因此通常更容易让Tomcat使用正确的缓存标头提供所有内容,而Apache在其前面捕获内容,将其提供给需要的浏览器,并将其缓存,以便其他浏览器能够直接从Apache获取同一文件,而不会干扰Tomcat。

除了静态文件之外,还可能不需要每毫秒更新许多动态内容。例如,主页加载的json告诉用户数据库中有多少东西,这是一个昂贵的查询,执行数千次,可以安全地每小时执行一次,而不会让用户生气。因此,tomcat可以使用适当的一小时缓存指令为json提供服务,Apache将缓存json片段并将其提供给需要它一小时的任何浏览器。显然有很多其他方法可以实现它(缓存过滤器,缓存查询的JPA缓存等等),但是发送适当的缓存头并使用Apache作为反向代理非常容易,符合REST并且可以很好地扩展。

另一个考虑因素是负载平衡。 Apache带有一个很好的负载平衡模块,它可以帮助您在许多Tomcat实例上扩展应用程序,假设您的应用程序可以水平扩展或在集群上运行。

第三个考虑是关于溃疡,标题等。有时你可能需要更改一些网址,或删除或覆盖一些标题。例如,在重大更新之前,您可能希望在浏览器上禁用缓存几个小时以避免浏览器继续使用陈旧数据(与在切换服务器之前降低DNS TTL相同),或者将旧应用程序移动到另一个URL空间,或者重写旧的可能的URL到新的URL。虽然可以重新配置web.xml文件中的servlet,并且过滤器可以创建奇迹,但如果您使用的是解释URL的框架,则可能需要对站点地图文件或类似内容进行大量工作。

在Tomcat之前安装Apache或其他Web服务器可能只会使用mod_rewrite等模块帮助大量更改Apache配置文件。

所以,我总是建议在Tomcat前面安装Apache httpd。由于资源缓存,通常会恢复连接处理的小开销,并且在您第一次需要移动URL或处理某些标头时,会重新获得其他配置工作。

答案 1 :(得分:1)

这取决于您的网络以及您希望如何设置安全性。

如果你有一个双防火墙DMZ,在第二个防火墙内部署了应用程序,那么在两个防火墙之间安装一个Apache或IIS实例来处理对应用服务器的安全和代理调用是有意义的。如果将Tomcat实例放入DMZ是可以接受的,那么您可以自由地执行此操作。我看到的唯一缺点是你必须在第二个防火墙中打开一个端口来访问里面的数据库。这可能会使数据库面临风险。

另一个考虑因素是交通。您没有说任何有关流量,调整服务器大小以及可能的负载平衡和群集的信息。应用服务器群集前面的负载均衡器更有可能保留在第二个防火墙内。 Tomcat实例能够自行处理流量,但总是存在卷限制,具体取决于它部署的硬件以及应用程序对每个请求执行的操作。如果没有更详细的,特定于应用程序的信息,几乎不可能给出是或否答案。

在网站上搜索“没有apache的tomcat” - 之前有人问过它。在找到重复之前,我投票结束了。