rvd*_*vdb 8 configuration tomcat uri apache-2.2
我正在设置一个反向代理配置,其中路径以“/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/
Run Code Online (Sandbox Code Playgroud)
(注意:我使用了 ProxyPreserveHost,因为我的 Tomcat 应用程序需要访问原始主机以生成更多链接)。一切顺利,除了由我的 Tomcat 应用程序的一部分生成的绝对链接。鉴于上述配置,我的 Tomcat 应用程序将“看到”这个请求:http://mydomain/my_app,因此生成没有“/apps/”前缀的链接,应该触发这些链接的代理。
我花了一些时间,但我现在明白这是代理的基本特征,并且没有“标准”方式将原始请求的“/apps/”前缀传递给代理应用程序。因此,我开始研究另一种可能性,即为所有 Tomcat 应用程序定义一个全局前缀,并使用以下设置代理 Tomcat 应用程序:
ProxyPreserveHost on
ProxyPass /apps/ http://localhost:8082/apps/
ProxyPassReverse /apps/ http://mydomain/apps/
Run Code Online (Sandbox Code Playgroud)
这会将http://mydomain/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>
Run Code Online (Sandbox Code Playgroud)
虽然这使得 my_app Tomcat 应用程序可以在http://localhost:8082/apps/my_app/ 访问,但它也建议所有 Tomcat 应用程序都应该在单独的元素中手动定义。这使得添加新的 Tomcat Web 应用程序变得不那么灵活(并且实际上意味着比在 Apache 配置中为每个应用程序声明单独的代理规则更多的配置工作,没有“/apps/”前缀)。我试过这个:
<Context path="/apps" docBase="/" reloadable="true"/>
Run Code Online (Sandbox Code Playgroud)
(以及@docBase 变体,例如“”或“.”),但这不起作用:Tomcat 控制台输出中没有部署任何 web 应用程序的迹象,并且所有请求都返回 404 错误。
因此我的问题是:是否有一种简单的(r)方法可以为 Tomcat webapps '声明'全局 URI 前缀?
任何建议非常感谢!
罗恩
为了其他人的利益,我会回答我自己的问题。实际上,Tomcat(自版本 6 起)提供了一个非常简单的解决方案,用于向 Web 应用程序添加 URI 前缀,方法是使用该前缀(或这些前缀)为 Web 应用程序文件夹或 WAR 文件名添加前缀,并用哈希分隔。所以,例如:
${catalina.base}/webapps/apps#my_app
${catalina.base}/webapps/apps#my_app2.war
Run Code Online (Sandbox Code Playgroud)
...将分别通过http://localhost:8082/apps/my_app/和http://localhost:8080/apps/my_app2/进行访问,无需在 ${catalina.base}/conf/ 中进行任何进一步配置服务器.xml。
Tomcat Context Container参考中对此进行了一些神秘的解释,但是在 Tomcat 用户邮件列表中看到此类消息对我帮助很大。
不幸的是,有一个问题:显然,Cocoon(截至 2.1.11,尚未使用 2.2 应用程序进行测试)在路径包含哈希的 Web 应用程序上卡住(请参阅https://issues.apache.org/jira/browse/COCOON-第2270章
然而,对于那些基于 Cocoon 的 Web 应用程序有一个解决方法,如以下配置步骤所示:
添加文件 ${catalina.base}\conf\Catalina[主机名][前缀]#[应用程序名称].xml,例如:${catalina.base}\conf\Catalina\localhost\apps#my_CocoonApp.xml,其中以下内容:
<Context docBase="F:/cocoonApps/my_CocoonApp"/>
使用此解决方法,即使是 Cocoon Web 应用程序在访问http://localhost:8082/apps/my_CocoonApp/时也会感到满意。这可以允许 Tomcat Web 应用程序的相当灵活的管理开销:
通过我原来的问题中解释的 Apache 代理设置,这使得可以灵活地添加 Tomcat 应用程序并使用 /apps/ URI 前缀在 Apache 后面进行反向代理。
| 归档时间: |
|
| 查看次数: |
12015 次 |
| 最近记录: |