我正在设置一个反向代理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步骤所示:
添加文件$ {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理开销:
通过我在原始问题中解释的Apache代理设置,可以灵活地添加Tomcat应用程序,并使用/ apps / URI前缀在Apache后反向代理。