代理支援指南
目錄
簡介
使用 Tomcat 的標準設定,Web 應用程式可以要求伺服器名稱和埠號,以進行處理。當 Tomcat 以獨立模式與 HTTP/1.1 連接器 執行時,它通常會報告請求中指定的伺服器名稱,以及 連接器 正在監聽的埠號。為此,有興趣的 servlet API 呼叫為
ServletRequest.getServerName()
:傳回請求傳送到的伺服器的主機名稱。ServletRequest.getServerPort()
:傳回請求傳送到的伺服器的埠號。ServletRequest.getLocalName()
:傳回接收請求的網際網路通訊協定 (IP) 介面的主機名稱。ServletRequest.getLocalPort()
:傳回接收請求的網際網路通訊協定 (IP) 介面的埠號。
當您在代理伺服器(或設定為像代理伺服器一樣運作的 Web 伺服器)後面執行時,您有時會偏好管理這些呼叫傳回的值。特別是,您通常希望埠號反映原始請求中指定的埠號,而不是 連接器 本身正在監聽的埠號。您可以在 <Connector>
元素上使用 proxyName
和 proxyPort
屬性來設定這些值。
代理支援可以採取許多形式。下列各節說明數個常見情況的代理組態。
Apache httpd 代理支援
Apache httpd 1.3 及更新版本支援一個選用模組 (mod_proxy
),此模組會將網頁伺服器組態為代理伺服器。這可以用於將特定網頁應用程式的要求轉送至 Tomcat 執行個體,而無須組態網頁連接器,例如 mod_jk
。若要執行此動作,您需要執行下列工作
組態您的 Apache 副本,以包含
mod_proxy
模組。如果您從原始碼建置,執行此動作最簡單的方式是在./configure
命令列中包含--enable-module=proxy
指令。如果您尚未新增,請確定您在 Apache 啟動時載入
mod_proxy
模組,方法是在httpd.conf
檔案中使用下列指令LoadModule proxy_module {path-to-modules}/mod_proxy.so
在您的
httpd.conf
檔案中,為您希望轉送至 Tomcat 的每個網頁應用程式包含兩個指令。例如,若要轉送一個位於內容路徑/myapp
的應用程式ProxyPass /myapp https://127.0.0.1:8081/myapp ProxyPassReverse /myapp https://127.0.0.1:8081/myapp
它會指示 Apache 將
https://127.0.0.1/myapp/*
形式的 URL 轉送至在埠 8081 上偵聽的 Tomcat 連接器。組態您的 Tomcat 副本,以包含一個特殊的
<Connector>
元素,並具有適當的代理設定,例如<Connector port="8081" ... proxyName="www.mycompany.com" proxyPort="80"/>
它會讓此網頁應用程式中的 servlet 認為所有代理要求都導向至埠 80 上的
www.mycompany.com
。從
<Connector>
元素中省略proxyName
屬性是合法的。如果您執行此動作,request.getServerName()
傳回的值將是 Tomcat 執行的主機名稱。在上述範例中,它會是localhost
。如果您還有一個在埠 8080 上偵聽的
<Connector>
(巢狀在同一個 Service 元素中),則對任一埠的要求將共用同一組虛擬主機和網頁應用程式。您可能希望使用作業系統的 IP 過濾功能,以限制對埠 8081 (在此範例中) 的連線,僅允許來自執行 Apache 的伺服器。
或者,您可以設定一系列僅可透過代理存取的網頁應用程式,如下所示
當請求由 Apache 代理時,網路伺服器會在其存取日誌中記錄這些請求。因此,您通常會想要停用 Tomcat 本身執行的任何存取記錄。
當請求以這種方式代理時,所有針對已設定網路應用程式的請求都會由 Tomcat 處理(包括靜態內容的請求)。您可以使用 mod_jk
網路連接器來改善效能,而不是 mod_proxy
。mod_jk
可以設定為讓網路伺服器提供未由網路應用程式之部署描述符(/WEB-INF/web.xml
)中定義的篩選器或安全性約束處理的靜態內容。