【Tomcat】Tomcat原始碼解讀系列(一)——server.xml檔案的配置
Tomcat是JEE開發人員最常用到的開發工具,在Java Web應用的除錯開發和實際部署中,我們都可以看到Tomcat的影子。大多數時候,我們可以將Tomcat當做一個黑盒來看待,只需要將編寫的Java Web工程進行部署即可,但是,在遇到一些比較複雜難解決的問題時,如果我們瞭解了Tomcat的內部實現原理將會處理起來更得心應手更快地定位問題。另外,通過學習Tomcat的原始碼還可以更加深入地瞭解JEE規範,學習常見的設計模式。本系列的文章,將會介紹Tomcat的核心功能是如何實現的,一方面作為自己學習的總結,另一方面也希望給學習Tomcat的朋友提供一點幫助材料。
本文首先介紹Tomcat的基本配置,涉及的配置檔案就是\conf\server.xml檔案。Tomcat本身通過一系列的聯結器和內部元件來分別實現網路請求的監聽和處理。一個示例性的server.xml如下:
![收藏程式碼](http://lengyun3566.iteye.com/images/icon_star.png)
- <?xml version='1.0' encoding='utf-8'?>
- <Server port="8005" shutdown="SHUTDOWN">
- <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
- <Listener className="org.apache.catalina.core.JasperListener" />
- <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"
- <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
- <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 port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" />
- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
- <Engine name="Catalina" defaultHost="localhost">
- <Realm className="org.apache.catalina.realm.LockOutRealm">
- <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
- resourceName="UserDatabase"/>
- </Realm>
- <Host name="localhost" appBase="webapps"
- unpackWARs="true" autoDeploy="true">
- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
- prefix="localhost_access_log." suffix=".txt"
- pattern="%h %l %u %t "%r" %s %b" resolveHosts="false"/>
- </Host>
- </Engine>
- </Service>
- </Server>
從上面的配置我們中,位於配置檔案頂層的是Server和Service元素,其中Server元素是整個配置檔案的根元素,而Service元素則是配置伺服器的核心元素。在Service元素內部,定義了一系列的聯結器和內部容器類的元件。現在分別對其進行簡單的介紹,後續的文章將會對其進行逐一分析。
<Server>元素對應的是整個Servlet容器,是整個配置的頂層元素,由org.apache.catalina.Server介面來定義,預設的實現類是org.apache.catalina.core. StandardServer。該元素可配置的屬性主要是port和shutdown,分別指的是監聽shutdown命令的埠和命令(這兩個屬性沒玩過,後續試試)。在該元素中可以定義一個或多個<Service>元素,除此以外還可以定義一些全域性的資源或監聽器。
<Service>元素由org.apache.catalina.Service介面定義,預設的實現類為org.apache.catalina.core. StandardService。在該元素中可以定義一個<Engine>元素、一個或多個<Connector>元素,這些<Connector>元素共享同一個<Engine>元素來進行請求的處理。
<Engine>元素由org.apache.catalina.Engine元素來定義,預設的實現類是org.apache.catalina.core. StandardEngine。<Engine>元素會用來處理<Service>中所有<Connector>接收到的請求,在<Engine>中可以定義多個<Host>元素作為虛擬主機。<Engine>是Tomcat配置中第一個實現org.apache.catalina.Container的介面,因此可以在其中定義一系列的子元素如<Realm>、<Valve>。
< Connector >元素由org.apache.catalina.connector. Connector類來定義。< Connector>是接受客戶端瀏覽器請求並向用戶最終返回響應結果的元件。該元素位於< Service>元素中,可以定義多個,在我們的示例中配置了兩個,分別接受AJP請求和HTTP請求,在配置中,需要為其制定服務的協議和埠號。
<Host>元素由org.apache.catalina.Host介面來定義,預設實現為org.apache.catalina.core. StandardHost,該元素定義在<Engine>中,可以定義多個。每個<Host>元素定義了一個虛擬主機,它可以包含一個或多個Web應用(通過<Context>元素來進行定義)。因為<Host>也是容器類元素,所以可以在其中定義子元素如<Realm>、<Valve>。
<Context>元素由org.apache.catalina.Context介面來定義,預設實現類為org.apache.catalina.core. StandardContext。該元素也許是大家用的最多的元素,在其中定義的是Web應用。一個<Host>中可以定義多個<Context>元素,分別對應不同的Web應用。該元素的屬性,大家經常會用到如path、reloadable等,可以在<Context>中定義子元素如<Realm>、<Valve>。
以上簡單介紹了Tomcat元素的配置,使我們可能對這個龐大的產品有個整體的瞭解,後續會對每個部分進行詳細的介紹,下部分會首先介紹Tomcat的啟動流程。