为 Tomcat Web 应用添加全局 URI 前缀

为 Tomcat Web 应用添加全局 URI 前缀

我正在设置一个反向代理配置,其中所有路径以“/apps/”开头的请求都应由 Apache 代理到 Tomcat。在我看来,这有两个好处:它可以将代理保留到 URI 空间的“/apps/”部分,并且对所有 Tomcat 应用程序仅使用单个代理规则(即,对任何 Tomcat 应用程序的请求都应以“/apps/”开头)。

例如,请求http://我的域名/apps/my_app/应该代理http://localhost:8082/my_app/。请注意,Tomcat URI 中没有“/apps/”前缀:“my_app”位于常规位置 ${CATALINA_HOME}/webapps/my_app。

我使用 Apache vhost.conf 文件中的以下代理规则实现了此目的:

ProxyPreserveHost    on
ProxyPass            /apps/    http://localhost:8082/
ProxyPassReverse    /apps/    http://mydomain/

(注意:我使用了 ProxyPreserveHost,因为我的 Tomcat 应用程序需要访问原始主机才能生成进一步的链接)。除了由我的 Tomcat 应用程序的一部分生成的绝对链接外,一切顺利。鉴于上述配置,我的 Tomcat 应用程序将“看到”此请求:http://我的域名/my_app,从而生成没有“/apps/”前缀的链接,这些链接应该触发这些链接的代理。

我花了一些时间,但现在我明白了这是代理的基本特性,并且没有“标准”方法将原始请求的“/apps/”前缀传递给代理应用程序。因此,我开始研究另一种可能性,即为所有 Tomcat 应用程序定义一个全局前缀,并使用以下设置代理 Tomcat 应用程序:

ProxyPreserveHost    on
ProxyPass            /apps/    http://localhost:8082/apps/
ProxyPassReverse    /apps/    http://mydomain/apps/

这将代理请求http://我的域名/apps/my_app/http://localhost:8082/apps/my_app/由于 Tomcat 服务器上的所有应用程序都将通过代理进行访问,因此我认为所有 Tomcat 应用程序都需要这个“/apps/”前缀。

到目前为止,一切顺利。然而,我在 Tomcat 方面遇到了困难:找到一种方法来为 Tomcat 应用程序的请求添加全局路径前缀。我最接近的方法是:1. 不要触及 Tomcat 应用程序的物理位置:将它们保留在 ${CATALINA.HOME}/webapps 2. 更改 ${CATALINA.HOME}/conf/server.xml,如下所示:

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="false" deployOnStartup="false">
  <Context path="/apps/my_app" docBase="/my_app/" reloadable="true"/>
</Host>

虽然这使得 my_app Tomcat 应用程序可以在http://localhost:8082/apps/my_app/,它还建议所有 Tomcat 应用程序都应在单独的元素中手动定义。这使得添加新的 Tomcat Web 应用程序变得不那么灵活(实际上,这比在 Apache 配置中为每个应用程序声明单独的代理规则(没有“/apps/”前缀)需要更多的配置工作)。我试过这个:

<Context path="/apps" docBase="/" reloadable="true"/>

(以及@docBase 变体,例如“”或“。”),但这不起作用:没有任何迹象表明 Tomcat 控制台输出中部署了任何 web 应用程序,并且所有请求都返回 404 错误。

因此我的问题是:是否有一种简单的方法来“声明” Tomcat webapps 的全局 URI 前缀?

非常感谢您的任何建议!

罗恩

答案1

为了其他人的利益,我将回答我自己的问题。实际上,Tomcat(自版本 6 以来)提供了一种非常简单的解决方案,用于将 URI 前缀添加到 webapps,方法是在 webapp 文件夹或 WAR 文件名前加上该前缀(或这些前缀),并用井号分隔。因此,例如:

${catalina.base}/webapps/apps#my_app
${catalina.base}/webapps/apps#my_app2.war

...将使两者都可以通过http://localhost:8082/apps/my_app/http://localhost:8080/apps/my_app2/,无需在${catalina.base}/conf/server.xml 中进行任何进一步的配置。

Tomcat 上下文容器参考,但请参阅这条信息Tomcat 用户邮件列表上的帮助对我很大。

很遗憾,有一个问题:显然,Cocoon(最高到 2.1.11,还没有测试过 2.2 应用程序)会阻塞路径包含哈希的 Web 应用程序(请参阅https://issues.apache.org/jira/browse/COCOON-2270)。

但是,对于那些基于 Cocoon 的 Web 应用程序,有一个解决方法,如以下配置步骤所示:

  1. 将包含 webapp 的文件夹或 WAR 文件移到主机的 appBase 路径之外,例如:F:\cocoonApps\my_CocoonApp
  2. 添加文件${catalina.base}\conf\Catalina[主机名][前缀]#[应用名].xml,例如:${catalina.base}\conf\Catalina\localhost\apps#my_CocoonApp.xml,内容如下:

    <Context docBase="F:/cocoonApps/my_CocoonApp"/>

使用这个解决方法,即使是 Cocoon webapps 在访问时也能正常运行,例如http://localhost:8082/apps/my_CocoonApp/. 这可以使 Tomcat webapps 的管理开销非常灵活:

  • 非基于 Cocoon 的 Web 应用程序:只需将它们添加到主机的 appBase 中,在文件夹或 WAR 文件的名称前添加所需的前缀,并用井号 (#) 分隔。添加新的非 Cocoon Web 应用程序不需要进一步的步骤,只需将它们与所需的 URI 前缀一起存储即可。
  • 基于 Cocoon 的 Web 应用程序:将它们存储在主机的 appBase 之外,只使用不带前缀的 Web 应用程序名称。此外,为每个基于 Cocoon 的 Web 应用程序添加一个上下文文件,并如上所述指定 Web 应用程序。此附加步骤仅适用于基于 Cocoon 的 Web 应用程序。

通过我在原始问题中解释的 Apache 代理设置,可以灵活地添加 Tomcat 应用程序并使用 /apps/ URI 前缀在 Apache 后面进行反向代理。

相关内容