tomcat中server.xml以及核心元件講解
阿新 • • 發佈:2019-01-09
閒暇時間整理下對於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 "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
- 核心元件結構圖
- 唯一的tomcat容器對應唯一的server元件;
- server元件包括多個service服務,服務這個詞的定義需要根據各位自己的理解了,我暫時將它理解為系統;
- connector作為service服務的聯結器,主要負責service的出入口,提供http、https、ajp等協議的支援;
- 唯一的service對應唯一的engine,可理解為引擎,一個系統有且僅有一個引擎;
- engine下對應多個虛擬主機,支援engine的運轉;
- context可以理解為‘應用’,每個虛擬主機下有一系列的應用,當然這些應用都是獨立的,是否有影響也是要根據需求來定;
- wrapper就更加簡單了,可以理解為每一個servlet就是一個wrapper,形形色色的wrapper組成了一個應用;
- 總結來說,我們要訪問http://www.ziyoujiayuan.com/dagger/test.shtml這個路徑的時候,忽略代理服務的應用,http就受到connector影響,www.ziyoujiayuan.com就會受到host影響,dagger自然就是context定義的了,而test.shtml就是一個wrapper。
如有不足的地方請及時指正,若讀者對於tomcat容器的個性化定製以及底層實現原理感興趣,歡迎及時評論,作者會按需及時更新相關內容。