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