Tomcat源碼解讀系列(一)——server.xml文件的配置


Tomcat是JEE開發人員最常用到的開發工具,在Java Web應用的調試開發和實際部署中,我們都可以看到Tomcat的影子。大多數時候,我們可以將Tomcat當做一個黑盒來看待,只需要將編寫的Java Web工程進行部署即可,但是,在遇到一些比較復雜難解決的問題時,如果我們了解了Tomcat的內部實現原理將會處理起來更得心應手更快地定位問題。另外,通過學習Tomcat的源碼還可以更加深入地了解JEE規范,學習常見的設計模式。本系列的文章,將會介紹Tomcat的核心功能是如何實現的,一方面作為自己學習的總結,另一方面也希望給學習Tomcat的朋友提供一點幫助材料。

         本文首先介紹Tomcat的基本配置,涉及的配置文件就是\conf\server.xml文件。Tomcat本身通過一系列的連接器和內部組件來分別實現網絡請求的監聽和處理。一個示例性的server.xml如下:

<?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 &quot;%r&quot; %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的啟動流程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM