Tomcat基本組件、其功能和處理請求的過程


 
一、Tomcat是一個基於組件的服務器,它的構成組件都是可配置的,其中最外層的組件是Catalina Servlet容器,其他的組件按照一定的格式要求配置在這個頂層容器中
Tomcat的各個組件是在<TOMCAT_HOME>\conf\server.xml文件中配置的,如下:
 
XML配置文件結構
 
<Server>                     頂層類元素:一個配置文件中只能有一個<Server>元素,可包含多個Service。
    <Service>                頂層類元素:本身不是容器,可包含一個Engine,多個Connector。
        <Connector/>         連接器類元素:代表通信接口。
           <Engine>          容器類元素:為特定的Service組件處理所有客戶請求,可包含多個Host。
              <Host>         容器類元素:為特定的虛擬主機處理所有客戶請求,可包含多個Context。
                 <Context>   容器類元素:為特定的Web應用處理所有客戶請求。 
                 </Context>
               </Host>
              </Engine>
     </Service>
</Server>
 
server.xml文件的基本組成結構如下
 

 

 
 
1.Server組件
 
A Server element represents the entire Catalina servlet container. Therefore, it must be the single outermost element in the conf/server.xml configuration file. Its attributes represent the characteristics of the servlet container as a whole.
 
一個Server組件代表整個Catalina servlet容器,所以它在server.xml配置文件中必須是單個最外層元素,它的屬性代表整個servlet容器的特性,      一個Server組件由一個或多個service組件組成
 
 
Common Attributes(通用屬性):
    1.ClassName    一個實現了org.apache.catalina.Server接口的類,如果不指定,將使用標准實現類
        org.apache.catalina.core.StandardServer.   
    2.address    一個TCP/IP地址,默認localhost,用於指定server組件等待shutdown(關閉服務器)指令的ip地址
    3.port   一個TCP/IP端口,用於指定server組件等待shutdown(關閉服務器)指令的port端口,如果設置-1,將使shutdown port失效
    4.shutdown  一個命令字符串,為了關閉服務器,必須將該命令字符串通過指定ip和端口傳給該Server組件
    
 
2.service組件
    A  Service element represents the combination of one or more  Connector components that share a single  Engine component for processing incoming requests. One or more  Service elements may be nested inside a  Server element.
 
一個Service組件由一個或多個Connector連接器組件組成,並且這個Service中的Connector共享一個Engine組件
 
Common Attributes(通用屬性):
    1.className     一個實現了org.apache.catalina.Service接口的類,如果不指定,將使用標准實現類org.apache.catalina.core.StandardService
    2.name       Service組件的展示名,如果使用標准的Catalina組件該名稱將包含在log信息中,必須保持唯一性
 
3.Executor組件(thread pool)
    The Executor represents a thread pool that can be shared between components in Tomcat.
    Executor組件代表在Tomcat各組件之間可共享的一個線程池,一直以來,每個被創建的Connector組件都有自己的一個線程池,但是允許你在多個Connector之間共享一個線程池
 
Common Attributes(通用屬性):
    1.className     一個實現了org.apache.catalina.Executor 接口的類,該接口確保了兩件事,1.通過它的name屬性能夠找到該接口實現類,2實現類的生命周期  在容器中的開始和結束,如果不指定,將使用標准實現類org.apache.catalina.core.StandardThreadExecutor
    2.name       該name被用來在server.xml中其它地方獲取該線程池,必須保持唯一性
 
默認實現類 還支持下面的屬性:
    1.threadPriority  該線程池線程的優先級  默認為the Thread.NORM_PRIORITY constant = 5
  2.daemon     制定線程是否為守護線程(后台線程)
  3.namePrefix  被該線程池創建的線程的名稱前綴,線程名稱組成:namePrefix+threadNumber
    4.maxThreads    最大活躍線程數,默認200
    5.minSpareThreads 最小活躍線程數,默認25
    6.maxIdleTime   在線程數大於 minSpareThreads時,一個空閑線程關閉前等待時間為多少毫秒,默認60000ms(1分鍾)
  7.maxQueueSize  可排列等待可用線程的可運行的最大任務數,默認Integer.MAX_VALUE
  8.prestartminSpareThreads 開始Executor組件時,是否開始minSpareThreads,默認false
    9.threadRenewalDelay  如果配置ThreadLocalLeakPreventionListener ,它將在更新線程池中線程前,通知Executor組件停止Context組件。 該參數為零避免在同一時間刷新所有線程,所以可設置兩個線程刷新時間間隔,ms,默認1000ms,If value is negative, threads are not renewed.
 
    
4.Connector組件 
    A "Connector" represents an endpoint by which requests are received  and responses are returned.
 
    Connector組件是接收請求和返回響應的端點, Tomcat服務器通過Connector連接器組件與客戶程序建立連接,負責接收客戶的請求,以及把Tomcat服務器的響應結果發送給客戶
 
    默認的兩種連接器
     <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443”/>
 
     <Connector port=“8009" protocol="AJP/1.3" redirectPort="8443”/>
 
第一個連接器監聽8080端口,負責建立HTTP連接。在通過瀏覽器訪問Tomcat服務器的Web應用時,使用的就是這個連接器。
 
第二個連接器監聽8009端口,負責和其他的HTTP服務器建立連接。在把Tomcat與其他HTTP服務器集成時,就需要用到這個連接器
 
Attributes(通用屬性):
    1.allowTrace   是否激活TRACE HTTP method,boolean值 ,默認false
    2.asyncTimeout   指定異步請求超時時間,單位ms,默認30000ms(30秒)
    3.enableLookups  如果設置true,request.getRemoteHost() 將通過執行 DNS lookups(DNS查找)返回遠程客戶端實際的主機名稱,如果設置false,將跳過DNS查找。默認false
    4.maxHeaderCount  指定一個請求的最大請求頭數量,如果超過該請求頭數量的請求將被拒絕,設置<0,意味不做限制。默認100
    5.maxParameterCount     指定請求參數值對的最大數量(get加Post),在這個數量內的參數,能夠自動被容器解析。超過的將被忽略,該值<0意味不做限制,默認10000.注意: Fail6edRequestFilter能夠用來拒絕請求,可以用來打破該限制
    6.maxPostSize  指定能夠被容器FORM URL parameter解析的最大字節數量。如果設置<=0將不做限制,默認2097152 (2 megabytes)
    7.maxSavePostSize 指定 FORM or CLIENT-CERT authentication期間,容器緩存POST請求的最大子節數。設置-1表示不做限制,0表示不緩存,默認4096 (4 kilobytes)
    8.parseBodyMethods   一個逗號分隔的HTTP方法列表,該列表中的請求體的參數將被解析, 默認POST
    9.port   Connector將在該端口創建一個server socket並等待連接。操作系統只允許一個server應用在一個指定ip地址下監聽一個端口。如果設置為0,Tomcat將隨機為gaiConnect組件分配一個空閑port。
    10.protocol  設置處理請求的協議,默認是HTTP/1.1 ,該協議將使用一個自動切換機制來選擇是用一個非阻塞的java NIO的連接器,還是用一個APR /本地連接器。主要是根據PATH (Windows) or LD_LIBRARY_PATH (on most unix systems)環境變量中是否包含Tomact本地庫,如果包含將采用后者,否則前者。對於APR /本地連接器對於HTTPS的設置將有別於非阻塞的java NIO的連接器。
To use an explicit protocol rather than rely on the auto-switching mechanism described above, the following values may be used:
org.apache.coyote.http11.Http11Protocol - blocking Java connector
org.apache.coyote.http11.Http11NioProtocol - non blocking Java NIO connector
org.apache.coyote.http11.Http11Nio2Protocol - non blocking Java NIO2 connector
org.apache.coyote.http11.Http11AprProtocol - the APR/native connector.
 
    11.proxyName   Connector組件正在使用代理配置,表示request.getServerName()的返回值
    12.proxyPort   Connector組件正在使用代理配置,表示request.getServerPort()的返回值
    13.redirectPort 如果此連接器支持非SSL請求,並接收到一個請求,一個匹配的<<安全約束>要求SSL傳輸,卡特琳娜自動將請求重定向到指定的端口號。
    14.scheme  request.getScheme()的返回值,默認http,如果你希望是https可以修改成https
    15.secure  設置request.isSecure()的返回值,默認false
    16.URIEncoding  指定在解碼URL后,用於解碼URI字節的字符編碼,默認 UTF-8 。但是在system property中設置org.apache.catalina.STRICT_SERVLET_COMPLIANCE 參數為true,那么ISO-8859-1將被使用
    17.useBodyEncodingForURI   該參數用於指定是否用contentType中指定的編碼用於URI查詢參數,而不用上面的URIEncoding編碼。默認false。注意該參數只正對請求的查詢參數有用,並不影響path部分。如果各種其它編碼設置都都指定,默認編碼都是ISO-8859-1
    18.useIPVHosts  將此屬性設置為true,將導致Tomcat使用接收請求的IP地址,來確定將請求發送到哪個Host主機。默認false
    19.xpoweredBy  Set this attribute to true to cause Tomcat to advertise support for the Servlet specification using the header recommended in the specification。默認false。
 
5.Engine組件 
    An Engine represents the entry point (within Catalina) that processes   every request.
 
    Engine組件是處理客戶請求的入口,代表整個處理請求的機構,一個Engine組件可以包含多個Host組件
 
Attributes(通用屬性):
    1.backgroundProcessorDelay     設置engine后台程序和它的子容器(組件)后台程序方法調用的時間間隔。如果延遲值不是負值(這意味着他們正在使用自己的處理線程),則不會調用子容器。默認是10s延遲
    2.className  一個實現了org.apache.catalina.Engine接口的類,如果不指定,將使用標准實現類org.apache.catalina.core.StandardEngine
    3.defaultHost     制定處理請求的主機名稱
    4.jvmRoute     
    5.name        代表該Engine的邏輯名稱,被用在日志和錯誤信息中,在同一個Server組件中,當有多個service組件,則該名稱必須保持唯一性
    6.startStopThreads   指定該Engine組件並行啟動Host組件的線程數,如果1.設置為0,則采用Runtime.getRuntime().availableProcessors()的返回值作為線程數,2.設置<0,則采用Runtime.getRuntime().availableProcessors() + value,如果(Runtime.getRuntime().availableProcessors() + value)<1,則為1。如果不指定,默認為1;
 
 
6.Host組件
    一個Host組件代表一個虛擬主機,一個Host組件可以包含多個Context組件(web應用)。tomcat會根據請求的域名找到對應的Host,如果找不到會使用默認的Host及名為localhost的Host。
 
Attributes(通用屬性):
    1.appBase   指定虛擬主機的基本目錄(發布應用的目錄(webapps)),可以是絕對路徑,也可以是相對$CATALINA_BASE directory的路徑,默認是webapps
    2.xmlBase    指定虛擬主機的XML基本目錄,是一個包含context xml的目錄。默認是conf/<engine_name>/<host_name>
    3.createDirs    如果設置為true,會創建appBase and xmlBase屬性指定的目錄,默認true
    4.autoDeploy  這個標志值指示Tomcat運行時是否應該定期檢查新的或更新的web應用程序,如果是真的,Tomcat的定期檢查appbase和xmlbase目錄,如果呦更新的web應用程序或上下文xml描述符將觸發web應用程序的重載。默認為true
    5.backgroundProcessorDelay  設置Host后台程序和它的子容器(組件)后台程序方法調用的時間間隔。默認-1,這意味着主機將依賴其父引擎的后台處理線程
    6.className     一個實現了org.apache.catalina.Host接口的類,如果不指定,將使用標准實現類org.apache.catalina.core.StandardHost
    7. deployIgnore    在 autoDeploy and deployOnStartup 被設置的情況下,可以指定被忽略的目錄,這是一個相對appBase的目錄。指定的目錄下的文件則不會被部署。可以是”. *foo.*”的表達式。
    8.deployOnStartup    指定該host下的web應用在Tomcat啟動時是否自動部署,默認true
    9.failCtxIfServletStartFails  如果指定為true,在配置有, load-on-startup >=0的servlet啟動失敗,則對應的web應用也啟動失敗, 默認值是false。
    10.name    指定Host組件的名稱。該名稱必須在你的Domain Name Service server有注冊。除類localhost
    11.startStopThreads     同Engine組件該參數的邏輯
    12.undeployOldVersions     不部署舊版本的應用,默認值false
 
 
 
7.Context組件
  一個Context組件代表一個web應用,context name 必須唯一,而context path可以不唯一。另外,有一個特殊的context有被提供,它的context path為””,這個是一個默認的context,它被用來處理所有沒被其他context path匹配的請求
 
 
   ###名稱對應表

 

 
 
Attributes(通用屬性):
    1.allowCasualMultipartParsing   如果為true,tomcat將自動解析 multipart/form-data數據。默認false
    2.backgroundProcessorDelay  同Engine對應屬性原理一樣
    3.className  一個實現了org.apache.catalina.Context接口的類,如果不指定,將使用標准實現類 org.apache.catalina.core.StandardContext
    4.docBase    web應用基本目錄
    5. path      web應用的context path。如果指定為””,則表示該應用為該Host的默認應用。
    
    
   
    
二、Tomcat處理一個HTTP請求的過程
假設來自客戶的請求為: http://localhost:8080/zhangboqing/welcome.jsp
1) 請求被發送到本機端口8080,被在那里偵聽的Coyote HTTP/1.1 Connector獲得
2) Connector把該請求交給它所在的Service的Engine來處理,並等待來自Engine的回應
3) Engine獲得請求localhost:8080/zhangboqing/welcome.jsp,匹配它所擁有的所有虛擬主機Host
4) Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的默認主機)
5) localhost Host獲得請求/zhangboqing/welcome.jsp,匹配它所擁有的所有Context
6) Host匹配到路徑為/zhangboqing的Context(如果匹配不到就把該請求交給路徑名為""的Context去處理)
7) path="/zhangboqing"的Context獲得請求/welcome.jsp,在它的mapping table中尋找對應的servlet
8) Context匹配到URL PATTERN為*.jsp的servlet,對應於JspServlet類
9) 構造HttpServletRequest對象和HttpServletResponse對象,作為參數調用JspServlet的doGet或doPost方法
10)Context把執行完了之后的HttpServletResponse對象返回給Host
11)Host把HttpServletResponse對象返回給Engine
12)Engine把HttpServletResponse對象返回給Connector
13)Connector把HttpServletResponse對象返回給客戶browser


 
 
 
 
 
 


免責聲明!

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



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