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