Tomcat 代理支持

2022-03-03 11:46 更新

簡(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ù)器名稱,以及連接器正在偵聽(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> 元素中的 proxyNameproxyPort 屬性來(lái)配置這些值。

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

Apache 1.3 代理支持

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)用,如下所示:

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

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 2.0 代理支持

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

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)