Web伺服器專題:Tomcat(一)基礎及模組
針對java系的經典伺服器,打算系統的整理一下Tomcat的機制和一些原理,以此記錄。
插一則題外話,關於tomat這個名字的由來:Tomcat 名稱的由來
關於Tomcat
基礎的 tomcat 內容就不過多贅述了,基本的百度百科都可以看到,在這裡我想從catlina入手介紹一下tomcat,我想很多人剛開始接觸tomcat,不論是日誌裡,bin目錄下的指令碼里,都會看見catlina這個東西,都會很困惑,什麼是 Catlina,說到 Catlina,就要介紹一些tomcat相比於Apache 的不同之處,簡單來說,Apache主要用來處理網路中的靜態資源請求(HTML,CSS、圖片等),而tomcat是專為java的servlet而生的,簡單來說就是為J2EE提供環境的, 用來解析動態的資源處理(即後端的業務處理,動態資料等)的部分就被稱為 Catlina。
tomcat 繼承了Apache 作為web伺服器的基本功能,本身包含了三個重要的組成:
處理 html, js, css等 靜態頁面的Web容器;
根據不同的請求來呼叫不同的servlet的servlet容器Catlina;
編譯jsp的引擎Jasper
其實Catlina就是一個Servlet容器,它也是tomcat區別於其他伺服器的核心,整個Tomcat最核心的事就是進行Servlet的管理和根據前端的請求進行排程。
Tomcat的目錄層級及常用檔案
首先簡單記錄一下Tomcat的檔案目錄及一些常用的檔案。
Tomcat的目錄:
|---bin://存放啟動和關閉tomcat指令碼
|---conf://存放不同的配置檔案(server.xml和web.xml);
|---doc://存放Tomcat文件;
|---lib/japser/common://存放Tomcat執行需要的庫檔案(JARS);
|---logs://存放Tomcat執行時的LOG檔案;
|---src://存放Tomcat的原始碼;
|---webapps://Tomcat的主要Web釋出目錄(包括應用程式示例);
|---work://存放jsp編譯後產生的class檔案;
以上目錄中,一般我們基本開發部署中常用的基本就 bin 、conf 、logs三個,其中 tomcat 的系統級啟動shell、bat檔案均在bin目錄下,具體環境變數及啟動流程,都可以在start.sh或start.bat中檢視原始碼,這裡就不多說了,就主要說一下 conf 目錄下的檔案吧:
server.xml: Tomcat的主配置檔案,包含Service, Connector, Engine, Realm, Valve, Hosts主元件的相關配置資訊;
web.xml:遵循Servlet規範標準的配置檔案,用於配置servlet,併為所有的Web應用程式提供包括MIME對映等預設配置資訊;
tomcat-user.xml:Realm認證時用到的相關角色、使用者和密碼等資訊;Tomcat自帶的manager預設情況下會用到此檔案;在Tomcat中新增/刪除使用者,為使用者指定角色等將通過編輯此檔案實現;
catalina.policy:Java相關的安全策略配置檔案,在系統資源級別上提供訪問控制的能力;
catalina.properties:Tomcat內部package的定義及訪問相關控制,也包括對通過類裝載器裝載的內容的控制;Tomcat在啟動時會事先讀取此檔案的相關設定;
logging.properties: Tomcat6通過自己內部實現的JAVA日誌記錄器來記錄操作相關的日誌,此檔案即為日誌記錄器相關的配置資訊,可以用來定義日誌記錄的 元件級別以及日誌檔案的存在位置等;
context.xml:所有host的預設配置資訊;
Tomcat架構
Tomcat的設計是基於模組化設計的,內部主要依賴於不同的模組元件構成, 這裡打算圖解一下Tomcat的內建元件及 一條請求的主要流程,話不多說,先上圖:
一句話簡單概括,一個tomcat只有一個Server作為根,它管理著多個Service服務,而Service服務又管理著多個Connector以及一個Container,其中核心元件為Connector以及Container。
Server
元件
從圖中可以看出,一個Tomcat只能有一個Server,Server就是一個Tomcat的例項。
Service
元件
Service其實是一個集合,它將Connector
元件與Container
元件包裝組合在一起(一個Service可以有多個Connector和一個Container),對外進行服務,而Service又是執行在Server中,也就是說,一個Tomcat可以有多個service
Connector
元件
該元件主要負責監聽指定埠的客戶端請求(不同埠對應不同的Connect元件),將Socket請求過來的資料,都封裝成Request請求物件,同時將該請求物件 傳遞給Container容器進行下一步的處理。
Container
元件
Container元件才是最接近Web應用的元件,它負責根據請求進行一系列的servlet呼叫,本身Container又包含四個子容器:Engine
、Host
、Context
、Wrapper
Container的容器組合如下圖:
Engine
:引擎,用來管理多個站點, 一個Service
最多隻能有一個Engine
;Host
:代表一個站點,也可以叫虛擬主機,通過配置Host 就可以新增站點;Context
:代表一個應用程式,即為我們開發的一個war
服務在webapp
目錄下的各個應用,或者一個WEB-INF
目錄以及下面的web.xml
檔案;Wrapper
:每個Wrapper
封裝著一個servlet
一次完整的流程:
1、當我們瀏覽器點選事件發生,傳送了一個http/https的請求,首先到達tomcat,即執行的例項server中
2、該請求被監聽 8080 埠的 connector監聽到,獲取請求報文後,封裝成Request請求,並將該請求發往Engine
3、Engine根據請求的url,搜尋使用哪個Host
4、當相應的Host獲取該請求後,根據請求中的地址,找尋相應的Context來處理該請求
5、Context根據其內部的對映表,獲取相應的servlet,並構造HttpServletRequest
物件和HttpServletResponse
物件,進行業務處理
6、Context將處理完的HttpServletResponse
物件返回給Host
7、Host再將結果返回Engine
8、Engine中心排程,將結果返回給 connector
9、connector將結果返歸給客戶端