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

我正在设置一个反向代理configuration,其中path以'/ apps /'开头的所有请求都应该由Apache代理到Tomcat。 这个IMO有两个好处:它可以保留代理到URI空间的“/ apps /”部分,并且对所有的Tomcat应用程序只使用一个代理规则(例如,任何Tomcat应用程序的请求应该开始'/应用/')。

例如,对http:// mydomain / 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应用程序的一部分生成的绝对链接。 鉴于上面的configuration,我的Tomcat应用程序将'看到'这个请求: http:// mydomain / my_app ,并因此生成链接不带'/ apps /'前缀应该触发这些链接的代理。

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

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

这将代理请求http:// mydomain / apps / my_app /到http:// localhost:8082 / apps / my_app / 。 由于Tomcat服务器上的所有应用程序都将在代理服务器后面访问,所以对于所有Tomcat应用程序来说,这个“/ apps /”前缀是没有问题的。

到现在为止还挺好。 然而,我正在为这种方法的Tomcat方面苦苦挣扎:find一种为Tomcat应用程序的请求添加全局path前缀的方法。 我得到的最接近的是: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> 

虽然这使得可以在http:// localhost:8082 / apps / my_app /访问my_app Tomcat应用程序 ,但是也表明所有Tomcat应用程序都应该在单独的元素中手动定义。 这使得添加新的Tomcat Web应用程序变得不那么灵活(实际上,这意味着更多的configuration工作,而不是在Apacheconfiguration中为每个应用程序声明单独的代理规则,没有'/ apps /'前缀)。 我试过这个:

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

(和@docBase变体,比如“”或“。”),但是这不起作用:在Tomcat控制台输出中没有指示任何webapps被部署,并且所有的请求都返回一个404错误。

因此,我的问题是:是否有一个简单的(r)为Tomcat webapps声明全局URI前缀的方法?

任何build议非常感谢!

罗恩

为了别人的利益,我会回答我自己的问题。 实际上,Tomcat(从版本6开始)提供了一个相当简单的解决scheme,通过在webapp文件夹或WAR文件名前面添加前缀(或前缀),并用哈希分隔来为webapp添加URI前缀。 所以,例如:

 ${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 Context Container引用中有些隐含的解释,但是在Tomcat-users邮件列表上看到这种消息对我有很大的帮助。

不幸的是 ,有一个问题:显然,Cocoon(2.1.11之前,还没有testing2.2应用程序)窒息的webapps的path中包含一个散列(请参阅https://issues.apache.org/jira/browse/COCOON- 2270 )。

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

  1. 将包含webapp的文件夹或WAR文件移动到主机的appBasepath之外,例如: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的相当灵活的pipe理开销:

  • 非基于Cocoon的Web应用程序:只需将它们添加到主机的应用程序库中,在文件夹或WAR文件的名称前加上所需的前缀(es),并用散列(#)分隔。 添加新的非Cocoon web应用程序不需要进一步的步骤,而是使用所需的URI前缀来存储它们。
  • 基于Cocoon的webapps:将它们存储在主机的appBase之外,只有前缀无名的webapp名称。 另外,为每个基于Cocoon的web应用程序添加一个上下文文件,如上所述指定webapp。 然后这个额外的步骤只需要基于Cocoon的webapps。

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