1. 程式人生 > >tomcat中server.xml以及核心元件講解

tomcat中server.xml以及核心元件講解

閒暇時間整理下對於tomcat中server.xml以及tomcat核心元件的理解,
有些不準確的地方還望及時指正,請轉發時尊重作者的勞動成果,註明出處。

  • 預設server.xml以及相關內容詮釋
<?xml version='1.0' encoding='utf-8'?>
<!-- 代表整個Tomcat容器,提供一個介面讓客戶端能夠訪問到這個Service集合,同時維護它所包含的所有的Service的宣告週期,包括如何初始化、如何結束服務、如何找到客戶端要訪問的Service,8005埠監聽shutdown命令 -->
<Server port="8005"
shutdown="SHUTDOWN">
<!-- 當Tomcat啟動時,該監聽器記錄Tomcat、Java和作業系統的資訊。該監聽器必須是配置的第一個監聽器 --> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <!-- Tomcat啟動時,檢查APR庫,如果存在則載入。APR,即Apache Portable Runtime,是Apache可移植執行庫,可以實現高可擴充套件性、高效能,以及與本地伺服器技術更好的整合 --> <Listener
className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<!-- 在Web應用啟動之前初始化Jasper,Jasper是JSP引擎,把JVM不認識的JSP檔案解析成java檔案,然後編譯成class檔案供JVM使用 --> <Listener className="org.apache.catalina.core.JasperListener" /> <!-- 與類載入器導致的記憶體洩露有關 --> <Listener className
="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<!-- 通過該監聽器,初始化< GlobalNamingResources>標籤中定義的全域性JNDI資源;如果沒有該監聽器,任何全域性資源都不能使用 --> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <!-- 當Web應用因thread-local導致的記憶體洩露而要停止時,該監聽器會觸發執行緒池中執行緒的更新。當執行緒執行完任務被收回執行緒池時,活躍執行緒會一個一個的更新。只有當Web應用(即Context元素)的renewThreadsWhenStoppingContext屬性設定為true時,該監聽器才有效 --> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <!-- GlobalNamingResources元素定義了全域性資源,通過配置可以看出,該配置是通過讀取$TOMCAT_HOME/conf/tomcat-users.xml實現的 --> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <!-- Connector接收連線請求,建立Request和Response物件用於和請求端交換資料;然後分配執行緒讓Engine來處理這個請求,並把產生的Request和Response物件傳給Engine --> <!-- http埠地址,協議版本號,��超時時間,埠重定向 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <!-- ajp埠地址,協議版本號,可應用於apacheJk外掛容器的通訊 --> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <!-- Realm提供了一種使用者密碼與web應用的對映關係,從而達到角色安全管理的作用(暫時沒用過) --> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <!-- 虛擬主機配置相關(虛擬主機名,應用地址,是否以war包形式執行,是否自動部署),Host元件至少有一個,且其中一個的name必須與Engine元件的defaultHost屬性相匹配,除預設主機名外,其他定義的主機名需要去專門的DNS伺服器申請 --> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 省略Context配置,虛擬主機的應用地址下,每個資料夾表示一個應用,ROOT可直接訪問,其他的需要加上應用名 --> <!-- Valve理解為'閥',目前主要有客戶訪問日誌閥,遠端地址過濾閥,遠端主機過濾閥,客戶請求記錄閥。AccessLogValve(客戶訪問日誌閥)的作用是通過日誌記錄其所在的容器中處理的所有請求 --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" /> </Host> </Engine> </Service> </Server>
  • 核心元件結構圖
    tomcat頂層結構圖
    1. 唯一的tomcat容器對應唯一的server元件;
    2. server元件包括多個service服務,服務這個詞的定義需要根據各位自己的理解了,我暫時將它理解為系統;
    3. connector作為service服務的聯結器,主要負責service的出入口,提供http、https、ajp等協議的支援;
    4. 唯一的service對應唯一的engine,可理解為引擎,一個系統有且僅有一個引擎;
    5. engine下對應多個虛擬主機,支援engine的運轉;
    6. context可以理解為‘應用’,每個虛擬主機下有一系列的應用,當然這些應用都是獨立的,是否有影響也是要根據需求來定;
    7. wrapper就更加簡單了,可以理解為每一個servlet就是一個wrapper,形形色色的wrapper組成了一個應用;
    8. 總結來說,我們要訪問http://www.ziyoujiayuan.com/dagger/test.shtml這個路徑的時候,忽略代理服務的應用,http就受到connector影響,www.ziyoujiayuan.com就會受到host影響,dagger自然就是context定義的了,而test.shtml就是一個wrapper。

如有不足的地方請及時指正,若讀者對於tomcat容器的個性化定製以及底層實現原理感興趣,歡迎及時評論,作者會按需及時更新相關內容。