代理支援指南

目錄

簡介

使用 Tomcat 的標準設定,Web 應用程式可以要求伺服器名稱和埠號,以進行處理。當 Tomcat 以獨立模式與 HTTP/1.1 連接器 執行時,它通常會報告請求中指定的伺服器名稱,以及 連接器 正在監聽的埠號。為此,有興趣的 servlet API 呼叫為

  • ServletRequest.getServerName():傳回請求傳送到的伺服器的主機名稱。
  • ServletRequest.getServerPort():傳回請求傳送到的伺服器的埠號。
  • ServletRequest.getLocalName():傳回接收請求的網際網路通訊協定 (IP) 介面的主機名稱。
  • ServletRequest.getLocalPort():傳回接收請求的網際網路通訊協定 (IP) 介面的埠號。

當您在代理伺服器(或設定為像代理伺服器一樣運作的 Web 伺服器)後面執行時,您有時會偏好管理這些呼叫傳回的值。特別是,您通常希望埠號反映原始請求中指定的埠號,而不是 連接器 本身正在監聽的埠號。您可以在 <Connector> 元素上使用 proxyNameproxyPort 屬性來設定這些值。

代理支援可以採取許多形式。下列各節說明數個常見情況的代理組態。

Apache httpd 代理支援

Apache httpd 1.3 及更新版本支援一個選用模組 (mod_proxy),此模組會將網頁伺服器組態為代理伺服器。這可以用於將特定網頁應用程式的要求轉送至 Tomcat 執行個體,而無須組態網頁連接器,例如 mod_jk。若要執行此動作,您需要執行下列工作

  1. 組態您的 Apache 副本,以包含 mod_proxy 模組。如果您從原始碼建置,執行此動作最簡單的方式是在 ./configure 命令列中包含 --enable-module=proxy 指令。

  2. 如果您尚未新增,請確定您在 Apache 啟動時載入 mod_proxy 模組,方法是在 httpd.conf 檔案中使用下列指令

    LoadModule proxy_module  {path-to-modules}/mod_proxy.so
    
  3. 在您的 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 連接器。

  4. 組態您的 Tomcat 副本,以包含一個特殊的 <Connector> 元素,並具有適當的代理設定,例如

    <Connector port="8081" ...
                  proxyName="www.mycompany.com"
                  proxyPort="80"/>

    它會讓此網頁應用程式中的 servlet 認為所有代理要求都導向至埠 80 上的 www.mycompany.com

  5. <Connector> 元素中省略 proxyName 屬性是合法的。如果您執行此動作,request.getServerName() 傳回的值將是 Tomcat 執行的主機名稱。在上述範例中,它會是 localhost

  6. 如果您還有一個在埠 8080 上偵聽的 <Connector> (巢狀在同一個 Service 元素中),則對任一埠的要求將共用同一組虛擬主機和網頁應用程式。

  7. 您可能希望使用作業系統的 IP 過濾功能,以限制對埠 8081 (在此範例中) 的連線,允許來自執行 Apache 的伺服器。

  8. 或者,您可以設定一系列僅可透過代理存取的網頁應用程式,如下所示

    • 組態另一個 <Service>,其中僅包含一個用於代理埠的 <Connector>
    • 為可透過代理存取的虛擬主機和網頁應用程式組態適當的 EngineHostContext 元素。
    • 選擇性地,使用先前說明的方式,以 IP 濾網保護埠 8081。
  9. 當請求由 Apache 代理時,網路伺服器會在其存取日誌中記錄這些請求。因此,您通常會想要停用 Tomcat 本身執行的任何存取記錄。

當請求以這種方式代理時,所有針對已設定網路應用程式的請求都會由 Tomcat 處理(包括靜態內容的請求)。您可以使用 mod_jk 網路連接器來改善效能,而不是 mod_proxymod_jk 可以設定為讓網路伺服器提供未由網路應用程式之部署描述符(/WEB-INF/web.xml)中定義的篩選器或安全性約束處理的靜態內容。