鍍金池/ 教程/ Linux/ 代理支持
連接器
JSPs
重寫機(jī)制
CGI
Tomcat Manager
Windows 認(rèn)證
代理支持
虛擬主機(jī)
安全性注意事項(xiàng)
如何在 Maven 中使用 Tomcat 庫(kù)
安裝
MBean 描述符
JNDI 資源
類加載機(jī)制
Tomcat Web 應(yīng)用部署
基于 APR 的原生庫(kù)
負(fù)載均衡器
安全管理
附加組件
監(jiān)控與管理
Windows 服務(wù)
集群化與會(huì)話復(fù)制
高級(jí) IO 機(jī)制
SSI(服務(wù)器端嵌入)
WebSocket 支持
JDBC 數(shù)據(jù)源
日志機(jī)制
默認(rèn) Servlet
SSL/TLS 配置
Tomcat 的 JDBC 連接池
第一個(gè)應(yīng)用
簡(jiǎn)介
Realm 配置

代理支持

簡(jiǎn)介

使用 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ù)器名稱,以及連接器正在偵聽的端口號(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ì)更愿意管理通過這些調(diào)用產(chǎn)生的值。特別是,你一般會(huì)希望端口號(hào)反應(yīng)指定在原始請(qǐng)求中的值,而非連接器所正在偵聽的那個(gè)值??梢允褂?<Connector> 元素中的 proxyNameproxyPort 屬性來配置這些值。

代理支持可以采取的形式有很多種。下面來討論適用于一些通常情況的代理配置。

Apache 1.3 代理支持

Apache 1.3 支持一種可選模式(mod_proxy),可以將 Web 服務(wù)器配置成代理服務(wù)器,從而將對(duì)于特定 Web 應(yīng)用的請(qǐng)求轉(zhuǎn)發(fā)給 Tomcat 實(shí)例,不需要配置 Web 連接器(比如說 mod_jk)。為了達(dá)成這一目標(biāo),需要執(zhí)行下列任務(wù):

1.配置 Apache,使其包含 mod_proxy 模塊。如果是從源碼開始構(gòu)建,最簡(jiǎn)單的方式是在 ./configure 命令行中包括 --enable-module=proxy 指令。

2.如果沒有添加 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 偵聽的 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 端口處偵聽。則針對(duì)這兩個(gè)端口之中任何一個(gè)端口的請(qǐng)求將共享同樣的虛擬主機(jī)和 Web 應(yīng)用。

7.你可以利用所在操作系統(tǒng)的 IP 過濾功能來限制與 8081 端口的連接。(在該例中),使其跟 8081 端口的連接只能從運(yùn)行 Apache 的服務(wù)器上

8.或者可以采用另外一種方式:可以設(shè)置一系列只能通過代理訪問的 Web 應(yīng)用,如下所示:

  • 為代理端口配置另一個(gè)只包含一個(gè) <Connector><Service>。
  • 為能通過代理訪問的虛擬主機(jī)和 Web 應(yīng)用配置適宜的 Engine、Host,以及 Context 元素。
  • 另外,還可以選擇利用 IP 過濾器保護(hù)端口 8081,如前文所述。

9.當(dāng)請(qǐng)求被 Apache 所代理處理時(shí),Web 服務(wù)器會(huì)在訪問日志中記下這些請(qǐng)求,所以通常應(yīng)該禁止 Tomcat 本身執(zhí)行訪問記錄。

通過以上介紹的這種方式來代理請(qǐng)求,所有針對(duì)已經(jīng)配置過的 Web 應(yīng)用的請(qǐng)求(包括針對(duì)靜態(tài)內(nèi)容的請(qǐng)求)都將由 Tomcat 處理。你可以通過 Web 連接器 mod_jk(而不是 mod_proxy)來提高性能。通過配置 mod_jk,還可以讓 Web 服務(wù)器提供靜態(tài)內(nèi)容服務(wù),這些靜態(tài)內(nèi)容沒有受到過濾器的處理,或者被 Web 應(yīng)用部署描述符文件中所定義的安全限制所束縛。

Apache 2.0 代理支持

和 Apache 1.3 中的指令大致相同,只不過在 Apache 2.0 中,可以省略 AddModule mod_proxy.c。

上一篇:基于 APR 的原生庫(kù)下一篇:JSPs