11

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

谢谢。

4

2 回答 2

17

出于多种原因,将 Apache(或任何其他 Web 服务器)放置在您的应用程序服务器(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 实例上扩展您的应用程序,假设您的应用程序可以水平扩展或在集群上运行。

第三个考虑因素是关于 ulrs、标头等。有时您可能需要更改一些 url,或者删除或覆盖一些标头。例如,在重大更新之前,您可能希望在浏览器上禁用缓存几个小时以避免浏览器继续使用陈旧数据(与切换服务器之前降低 DNS TTL 相同),或将旧应用程序移至另一个 url 空间,或重写旧的尽可能提供指向新网址的网址。虽然重新配置 web.xml 文件中的 servlet 是可能的,并且过滤器可以创造奇迹,但如果您使用的是解释 URL 的框架,您可能需要在站点地图文件或类似的东西上做很多工作。

在 Tomcat 前面安装 Apache 或其他 Web 服务器可能有助于仅更改带有 mod_rewrite 等模块的 Apache 配置文件。

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

于 2012-09-09T22:16:28.303 回答
1

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

如果您有一个双防火墙 DMZ,并且应用程序部署在第二个防火墙内,那么在两个防火墙之间有一个 Apache 或 IIS 实例来处理对应用程序服务器的安全性和代理调用是有意义的。如果将 Tomcat 实例放在 DMZ 中是可以接受的,那么您可以随意这样做。我看到的唯一缺点是您必须在第二个防火墙中打开一个端口才能访问其中的数据库。这可能会使数据库面临风险。

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

在网站上搜索“没有 apache 的 tomcat”——以前有人问过。在找到重复项之前,我投票关闭。

于 2012-09-09T21:40:06.947 回答