web服務器專題:tomcat(一)基礎及模塊
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將結果返歸給客戶端

進發:web服務器專題:tomcat(二)模塊組件與server.xml 配置文件

浙公網安備 33010602011771號