Tomcat 是最流行的 Servlet 容器,理解其組件層級與請求流轉路徑,有助於排查部署問題、優化效能、編寫自定義 Valve/Filter。本文基於 server.xml 結構,詳細解析 Server、Service、Connector、Engine、Host、Context 六大核心組件及 HTTP 請求處理全鏈路。
Server (單例)
└─ Service (可多個)
├─ Connector (可多個,如 HTTP/1.1、AJP)
└─ Engine (單個)
└─ Host (虛擬主機,可多個)
└─ Context (Web 應用,可多個)
└─ Servlet (多個)
代表整個 Catalina 容器,單例。包含一個或多個 Service,監聽 shutdown 命令端口(預設 8005)。
將一組 Connector 與一個 Engine 綁定。Connector 接收請求,Engine 處理請求。一個 Service 內所有 Connector 共享同一 Engine。
監聽特定端口,處理特定協議:
核心屬性:port、protocol、redirectPort(HTTPS 重定向)、maxThreads、connectionTimeout。
請求處理核心管道,包含多個 Host。屬性:defaultHost(未匹配 Host 時的兜底)。
虛擬主機,對應一個網域名。屬性:name、appBase(Webapps 目錄)、unpackWARs、autoDeploy。可配置 Alias 綁定多域名。
對應一個 Web 應用(WAR 包或解壓目錄)。路徑由 path 指定("" 為根應用)。核心:
① 載入 $CATALINA_HOME/conf/web.xml(全局)與 WEB-INF/web.xml(應用級)定義的 Servlet。
② 建立映射表 URL Pattern → Servlet。
③ 請求到達時,按「最長匹配」原則查找 Servlet 執行。
以請求 https://localhost:8080/wsota/wsota_index.jsp 為例:
Request/Response 物件。/wsota/wsota_index.jsp 匹配 Context(path="/wsota",最長匹配)。/wsota_index.jsp 對應的 Servlet(JSP 編譯產生的 Servlet 或 DefaultServlet)。service(req, resp),生成響應內容。定義 Server/Service/Connector/Engine/Host 結構。修改後需重啟生效。
$CATALINA_HOME/conf/web.xml:定義預設 Servlet(DefaultServlet、JspServlet)、預設 MIME 映射、Session 配置等。所有 Webapp 共享。WEB-INF/web.xml:應用專屬 Servlet/Filter/Listener/錯誤頁面/安全約束等。server.xml 中 <Context> 元素(不推薦,修改需重啟)。$CATALINA_BASE/conf/[engine]/[host]/ 下放置 xxx.xml(熱部署支援)。Host.appBase(預設 webapps),autoDeploy=true 時自動部署。maxThreads(預設 200)、acceptCount、compression、protocol="org.apache.coyote.http11.Http11NioProtocol"(NIO 非阻塞)。backgroundProcessorDelay 控制周期性任務(Session 清理、熱部署掃描)頻率。reloadable=false(生產環境)、sessionCookiePath、useHttpOnly。Tomcat 以層級組件模型實現 Servlet 規範:Connector 負責通訊,Engine/Host/Context 負責路由與生命週期。熟悉 server.xml 與 web.xml 的分工,能快速定位 404、ClassNotFound、Session 丟失等常見問題。