為 Tomcat Web 應用程序添加全域 URI 前綴
我正在設置一個反向代理配置,其中路徑以“/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 應用程序的一部分生成的絕對連結。鑑於上述配置,我的 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 方面苦苦掙扎:找到一種方法來為對 Tomcat 應用程序的請求添加全域路徑前綴。我得到的最接近的是:1.不要觸摸Tomcat應用程序的物理位置:將它們留在 $ {CATALINA.HOME}/webapps 2. change $ {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 控制台輸出中沒有任何 webapps 被部署的跡象,並且所有請求都返回 404 錯誤。
因此我的問題是:是否有一種簡單(r)的方式來“聲明”Tomcat webapps 的全域 URI 前綴?
非常感謝任何建議!
羅恩
為了他人的利益,我將回答我自己的問題。實際上,Tomcat(從版本 6 開始)提供了一個非常簡單的解決方案來為 webapps 添加 URI 前綴,方法是在 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/ 中進行任何進一步配置伺服器.xml。
在Tomcat 上下文容器參考中對其進行了一些神秘的解釋,但是在 Tomcat 使用者郵件列表中看到這種消息對我有很大幫助。
不幸的是,有一個問題:顯然,Cocoon(直到 2.1.11,尚未使用 2.2 應用程序測試)阻塞了路徑包含雜湊的 webapps(請參閱https://issues.apache.org/jira/browse/COCOON- 2270 )。
然而,對於那些基於 Cocoon 的 web 應用程序,有一種解決方法,如以下配置步驟所示:
- 將包含 webapp 的文件夾或 WAR 文件移到主機的 appBase 路徑之外,例如:F:\cocoonApps\my_CocoonApp
- 添加文件 $ {catalina.base}\conf\Catalina[host name][prefix]#[app name].xml, e.g.: $ {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 的 webapp:只需將它們添加到主機的 appBase 中,在文件夾或 WAR 文件的名稱前加上所需的前綴,並用井號 (#) 分隔。添加新的非 Cocoon Web 應用程序只需使用所需的 URI 前綴儲存它們即可。
- 基於 Cocoon 的 webapps:將它們儲存在 Host 的 appBase 之外,只使用不帶前綴的 webapp 名稱。此外,為每個基於 Cocoon 的 webapp 添加一個上下文文件,指定 webapp 的名稱,如上所述。只有基於 Cocoon 的 webapps 需要這個額外的步驟。
使用我原來的問題中解釋的 Apache 代理設置,可以靈活地添加 Tomcat 應用程序並使用 /apps/ URI 前綴將它們反向代理在 Apache 後面。