使用 Tomcat 的標準配置,Web 應用可以請求服務器名稱和端口號》。當 Tomcat 單獨和 HTTP/1.1 連接器運行時,通常會報告指定在請求中的服務器名稱,以及連接器正在偵聽的端口號。servlet API:
當你在代理服務器后(或者配置成具有代理服務器特征行為的 Web 服務器)運行時,可能有時會更愿意管理通過這些調用產生的值。特別是,你一般會希望端口號反應指定在原始請求中的值,而非連接器所正在偵聽的那個值??梢允褂?nbsp; 元素中的 proxyName 和 proxyPort 屬性來配置這些值。
代理支持可以采取的形式有很多種。下面來討論適用于一些通常情況的代理配置。
Apache 1.3 支持一種可選模式(mod_proxy),可以將 Web 服務器配置成代理服務器,從而將對于特定 Web 應用的請求轉發給 Tomcat 實例,不需要配置 Web 連接器(比如說 mod_jk)。為了達成這一目標,需要執行下列任務:
1.配置 Apache,使其包含 mod_proxy 模塊。如果是從源碼開始構建,最簡單的方式是在 ./configure 命令行中包括 --enable-module=proxy 指令。
2.如果沒有添加 mod_proxy 模塊,則檢查一下是否在 Apache 啟動時加載了該模塊,在 httpd.conf 文件中使用下指令:
LoadModule proxy_module {path-to-modules}/mod_proxy.soAddModule mod_proxy.c
3.在 httpd.conf 文件中包括兩個指令。分別為兩個要轉交給 Tomcat 的 Web 應用。例如,轉交上下文路徑 /myapp 處的應用,則需要如下指令:
ProxyPass /myapp http://localhost:8081/myapp
ProxyPassReverse /myapp http://localhost:8081/myapp
上述指令告訴 Apache 將 http://localhost/myapp/* 形式的 URL 轉交給在端口 8081 偵聽的 Tomcat 連接器。
4.配置 Tomcat,使其包含一個特殊的元素,并配置好相應的代理設置。范例如下所示:
<Connector port="8081" ...
proxyName="www.mycompany.com"
proxyPort="80"/>
這將導致該 Web 應用內的 servlet 認為,所有代理請求都指向的是 80 端口處的 www.mycompany.com。
5.可以忽略 元素的 proxyname 屬性,這是完全合法的。如果忽略,那么 request.getServerName() 返回值將是運行 Tomcat 的主機名——對于該例而言,它就是 localhost。
6.如果有一個 (內嵌于同一 Service 元素之中)在 8080 端口處偵聽。則針對這兩個端口之中任何一個端口的請求將共享同樣的虛擬主機和 Web 應用。
7.你可以利用所在操作系統的 IP 過濾功能來限制與 8081 端口的連接。(在該例中),使其跟 8081 端口的連接只能從運行 Apache 的服務器上
8.或者可以采用另外一種方式:可以設置一系列只能通過代理訪問的 Web 應用,如下所示:
9.當請求被 Apache 所代理處理時,Web 服務器會在訪問日志中記下這些請求,所以通常應該禁止 Tomcat 本身執行訪問記錄。
通過以上介紹的這種方式來代理請求,所有針對已經配置過的 Web 應用的請求(包括針對靜態內容的請求)都將由 Tomcat 處理。你可以通過 Web 連接器 mod_jk(而不是 mod_proxy)來提高性能。通過配置 mod_jk,還可以讓 Web 服務器提供靜態內容服務,這些靜態內容沒有受到過濾器的處理,或者被 Web 應用部署描述符文件中所定義的安全限制所束縛。
和 Apache 1.3 中的指令大致相同,只不過在 Apache 2.0 中,可以省略 AddModule mod_proxy.c。