tomcat 中的多个 webapps--最佳架构是什么?

tomcat 中的多个 webapps--最佳架构是什么?

我正在维护一个主要基于 Cocoon-2.1 的 Web 应用程序库 [http://cocoon.apache.org/2.1/],部署在 Tomcat servlet 容器中 [http://tomcat.apache.org/]并使用 Apache http 服务器进行代理 [http://httpd.apache.org/docs/2.2/]。我在概念上苦苦思索在 Tomcat 中部署多个 Web 应用程序的最佳方法。由于我不是 Java 程序员,而且我们没有任何系统管理员,所以我必须自己弄清楚什么是最明智的方法。我的设置经历了 2 种情况,我正在考虑第三种情况,以最大限度地分离不同的 Web 应用程序。

[1] 1 个 Tomcat 实例,1 个 Cocoon 实例,多个 webapps

-tomcat
  |_ webapps
     |_ webapp1
     |_ webapp2
     |_ webapp[n]
     |_ WEB-INF (with Cocoon libs)

这是我的第一个方法:只需将所有 Web 应用程序放在单个 Tomcat 容器内的单个 Cocoon webapps 文件夹中即可。这似乎运行良好,我没有遇到任何内存问题。

然而,这会带来可维护性缺陷,因为某些 Cocoon 组件可能会更新,这通常会影响 Web 应用程序的编码。因此,更新 Cocoon 变得很麻烦:由于所有 Web 应用程序共享同一个 Cocoon 组件池,因此更新其中一个组件需要同时更新所有 Web 应用程序中的代码。

为了隔离 Web 应用程序,我转向了第二种场景。

[2] 1 个 Tomcat 实例,每个 Web 应用都在其专用的 Cocoon 环境中

-tomcat
  |_ webapps
     |_ webapp1
     |  |_ WEB-INF (with Cocoon libs)
     |_ webapp1
     |  |_ WEB-INF (with Cocoon libs)
     |_ webapp[n]
        |_ WEB-INF (with Cocoon libs)

这种方法将所有 Web 应用分离到各自的 Cocoon 环境中,并在单个 Tomcat 容器内运行。理论上,这种方法效果很好:所有 Web 应用都可以独立更新。

然而,这很快就会导致 PermGenSpace 错误。我似乎可以通过增加 Tomcat 的内存分配来解决这个问题,但我意识到这不是一个结构性的解决方案,而且以这种方式超载单个 Tomcat 很容易导致将来出现内存错误。

这让我开始思考第三种情况。

[3] 多个 Tomcat 实例,每个实例在其专用的 Cocoon 环境中都有一个 Web 应用程序

-tomcat
 |_ webapps
    |_ webapp1
       |_ WEB-INF (with Cocoon libs)
-tomcat
 |_ webapps
    |_ webapp2
        |_ WEB-INF (with Cocoon libs)
-tomcat
 |_ webapps
    |_ webapp[n]
       |_ WEB-INF (with Cocoon libs)

我还没有尝试过这种方法,但我正在考虑 $CATALINA_BASE 变量。单个 Tomcat 发行版可以多次实例化不同的 $CATALINA_BASE 环境,每个环境都指向一个具有自己的 webapp 的 Cocoon 实例。我想知道这种方法是否可以避免方法 [2] 的结构内存相关问题,或者是否会出现相同的问题?

另一方面,这种方法会使 Apache http 前端的管理变得复杂,因为它需要不同 Tomcat 实例的 AJP 连接器监听不同的端口。因此,每当添加新的 webapp(在其自己的 Tomcat 实例中)时,Apache 的工作器配置都必须更新和重新加载。而且似乎没有办法在不重新启动整个 Apache http 服务器的情况下重新加载 worker.properties。

是否有另一种/更动态的方式来“模块化”多个 Tomcat 服务的 Web 应用程序,或者是否可以改进其中一种场景?

非常感谢任何想法、建议或意见。

罗恩

答案1

我已经完成了您提到的所有事情,现在我们完全转向了不同的方向。我们有一个 JEos VM 映像,用于精简的虚拟化操作系统,并为每个新应用程序克隆它。从内存/CPU/磁盘的角度来看,这不是最高效的,但可以让我免于“所有内容都挂接到哪个端口/目录”的困扰。

基本上,服务器决定我们使用哪个应用程序,而不是端口/目录/其他什么。

显然,如果您只有一台机器或已经虚拟化,那么这种方法就行不通了。在这种情况下,我建议使用通用的 CATALINA_BASE,并将每个新应用指向一个新的 CATALINA_HOME。在这种情况下,端口编号约定(例如按 10 为单位)对保持您的理智大有裨益(相信我)。

相关内容