web服務器專題:tomcat基礎及模塊

Web服務器專題:Tomcat(一)基礎架構

針對java系的經典服務器,打算系統的整理一下Tomcat的機制和一些原理,以此記錄。css

插一則題外話,關於tomat這個名字的由來:Tomcat 名稱的由來html

關於Tomcat

基礎的 tomcat 內容就不過多贅述了,基本的百度百科均可以看到,在這裏我想從catlina入手介紹一下tomcat,我想不少人剛開始接觸tomcat,不管是日誌裏,bin目錄下的腳本里,都會看見catlina這個東西,都會很困惑,什麼是 Catlina,說到 Catlina,就要介紹一些tomcat相比於Apache 的不一樣之處,簡單來講,Apache主要用來處理網絡中的靜態資源請求(HTML,CSS、圖片等),而tomcat是專爲java的servlet而生的,簡單來講就是爲J2EE提供環境的, 用來解析動態的資源處理(即後端的業務處理,動態數據等)的部分就被稱爲 Catlina。前端

tomcat 繼承了Apache 做爲web服務器的基本功能,自己包含了三個重要的組成:java

處理 html, js, css等 靜態頁面的Web容器;web

根據不一樣的請求來調用不一樣的servlet的servlet容器Catlina;shell

編譯jsp的引擎Jasper後端

其實Catlina就是一個Servlet容器,它也是tomcat區別於其餘服務器的核心,整個Tomcat最核心的事就是進行Servlet的管理和根據前端的請求進行調度。瀏覽器

Tomcat的目錄層級及經常使用文件

首先簡單記錄一下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又包含四個子容器:EngineHostContextWrapper

Container的容器組合以下圖:

Engine :引擎,用來管理多個站點, 一個Service最多隻能有一個Engine
Host :表明一個站點,也能夠叫虛擬主機,經過配置Host 就能夠添加站點;
Context :表明一個應用程序,即爲咱們開發的一個war服務在webapp目錄下的各個應用,或者一個WEB-INF 目錄以及下面的web.xml 文件;
Wrapper :每一個Wrapper 封裝着一個servlet

一次完整的流程:

一、當咱們瀏覽器點擊事件發生,發送了一個http/https的請求,首先到達tomcat,即運行的實例server中

二、該請求被監聽 8080 端口的 connector監聽到,獲取請求報文後,封裝成Request請求,並將該請求發往Engine

三、Engine根據請求的url,搜尋使用哪一個Host

四、當相應的Host獲取該請求後,根據請求中的地址,找尋相應的Context來處理該請求

五、Context根據其內部的映射表,獲取相應的servlet,並構造HttpServletRequest對象和HttpServletResponse對象,進行業務處理

六、Context將處理完的HttpServletResponse對象返回給Host

七、Host再將結果返回Engine

八、Engine中心調度,將結果返回給 connector

九、connector將結果返歸給客戶端

相關文章
相關標籤/搜索