目錄
- 概述
- 頂層元素(Top Level Elements)
- 1. Server
- 2. Service
- 線程池(Eecutors)
- 1. Executor
- 連接配接器(Connectors)
- 1. Http/1.1 Connector
- 容器(Containers)
- 1. Engine
- 2. Host
- 3. Context
概述
Tomcat安裝目錄中的conf/server.xml用于配置Tomcat Servlet/JSP容器的行為,本文介紹server.xml中的各配置元素的相關資訊。配置元素主要分為以下幾個種類:
- 頂層元素
是配置檔案的根元素,<Server>
代表一組連接配接器(Connector)和與之關聯的一個引擎(Engine)的組合。<Service>
-
連接配接器
代表用戶端發送請求到的特定服務(Service)以及從服務擷取相應的接口。
-
容器
代表用于處理請求并産生相應響應的一類元件。一個引擎(Engine)處理所在服務(Service)的所有請求;一個虛拟主機(Host)處理該虛拟主機的所有請求,一個上下文(Context)處理該Web應用的所有請求。
-
嵌套元件
表示可以嵌套在容器内部的元素。有些元素可以嵌套在任何容器,有些隻能嵌套在Context元素内部。
頂層元素(Top Level Elements)
1. Server
1)簡介
Server元素表示整個Servlet容器。它是配置檔案的根元素,它的屬性代表整個servlet容器的特征。
2)公共屬性
屬性名 | 描述 |
---|---|
className | Server元件的具體實作對應的的Java類的名稱,它必須實作 接口,如果沒有配置該屬性,預設使用标準實作,Server的标準實作Java類為 |
address | 用于接收shutdwn指令的TCP/IP的位址,如果沒有配置該屬性,預設使用 |
port | 用于接收shutdwn指令的TCP/IP的端口,設定為 可以禁用關閉指令端口 |
shutdown | 通過TCP/IP協定從特定端口接收的指令字元串,用于關閉Tomcat伺服器 |
2. Service
1)簡介
Service元素代表一個或多個Connector元件(用于接收請求)和與之關聯的一個Engine元件(用于處理請求)的組合。Server元素可以内嵌一個或多個Service元素。
2)公共屬性
屬性名 | 描述 |
---|---|
className | Service元件的具體實作對應的Java類的名稱,它必須實作 接口,如果沒有配置該屬性,預設使用标準實作,Service的标準實作Java類為 |
name | Service元件的名稱,标準實作中會用于日志資訊。Server中每個Service名稱必須唯一 |
線程池(Eecutors)
1. Executor
1)簡介
Executor代表可以在Tomcat各元件之間共享的線程池。預設每個Connector會實作自己的線程池,但是現在允許各個Connector元件和其它支援線程池的元件共享線程池。Executor元素内嵌于Service元素,并且應該出現在Connector元素之前,以便被Connector元件選擇使用。
2)公共屬性
屬性名 | 描述 |
---|---|
className | Executor元件的具體實作對應的Java類的名稱,它必須實作 接口,如果沒有配置該屬性,預設使用标準實作,Executor的标準實作Java類為 |
name | 用于在server.xml中的其他位置引用此池的名稱。 該名稱是必需的且唯一的。 |
連接配接器(Connectors)
1. Http/1.1 Connector
1)簡介
HTTP Connector元素表示支援 HTTP/1.1協定的Connector元件,它使Catalina除作為Servlet/JSP容器外,還具備作為獨立的Web伺服器的功能。一個服務(Service)可以有一個或多個Connector,運作在伺服器端的每個Connector元件的實作監聽特定的TCP端口,将請求轉發到關聯的Engine元件進行處理并生成相應。
Connector元件接收每個請求期間需要一個線程進行處理,如果并發請求數超過目前可用線程數,額外的線程将會被建立直到達到目前Connector元件允許建立的最大線程數(由maxThreads屬性設定,預設200,如果配置了線程池元件,該屬性将被忽略),如果仍有更多并發請求,它們将堆疊在目前Connector元件建立的server socket内(一個隊列),直到達到最大值(由acceptCount屬性設定,預設100),如果仍有更多并發請求,将會被拒絕。
2)公共屬性
屬性名 | 描述 |
---|---|
allowTrace | 設定是否支援請求方法Trace,預設為false |
asyncTimeout | 異步請求的逾時時間,機關為毫秒,預設為30000 |
maxHeaderCount | 請求攜帶的請求頭最大數量,超出限制請求會被拒絕,設定為負數表示不限制數量,預設為100 |
maxParameterCount | 請求攜帶的參數最大數量(GET和POST),超出請求會被拒絕,設定為負數表示不限制數量,預設為10000 |
port | Connector元件建立伺服器套接字并等待連接配接的TCP端口,如果設定為0,Tomcat将會為此Connector随機選擇一個可用的端口号,這通常僅适用于嵌入式和測試應用程式 |
protocal | 設定協定以處理傳入流量,預設值為HTTP / 1.1 |
redirectPort | 如果此Connector支援非SSL請求,并且收到比對的請求需要SSL傳輸,則Catalina将自動将請求重定向到此處指定的端口号 |
connectionTimeout | 用于設定建立連接配接後,Connector等待請求URI呈現的毫秒數 |
容器(Containers)
1. Engine
1)簡介
Engine元素表示對特定服務(Service)的全部請求的處理器。它從一個或多個連接配接器(Connector)接收請求并傳回完整的響應給連接配接器以便最終傳送給用戶端。Engine元素必須内嵌于Service元素中并跟随在Connector元素之後。
2)公共屬性
屬性名 | 描述 |
---|---|
defaultHost | 預設主機名,當發往本機的請求指定的host名稱不存在時,将使用defaultHost指定的host進行處理;是以,defaultHost的值,必須與Engine中的一個Host元件的name屬性值比對。 |
name | Engine元件的邏輯名稱,用于日志和錯誤資訊,在整個Server中必須唯一 |
2. Host
1)簡介
Host元素表示虛拟主機,在Tomcat正在運作的伺服器(Server)和伺服器的網絡名稱(域名)之間建立關聯,使用戶端能夠通過域名通路伺服器。如通過www.baidu.com通路百度伺服器。
一個或多個Host元素内嵌于Engine元素中,Host元素可以内嵌Context元素(代表與此虛拟主機關聯的Web應用),至少有一個Host元素name屬性與Engine元素的defaultHost屬性比對。
用戶端通常通過主機名通路伺服器,主機名将會包含在HTTP請求頭中,Tomcat會截取此資訊用于比對伺服器上的虛拟主機,如果沒有找到,則使用預設主機處理請求。
2)公共屬性
屬性名 | 描述 |
---|---|
appBase | 此虛拟主機的xml基目錄,這是可能包含要在此虛拟主機上釋出的Web應用的檔案夾的路徑,可以是絕對路徑,也可以是相對路徑(相對于 ),預設值為"webapps" |
xmlBase | 這是可能包含要在此虛拟主機上釋出的Web應用的xml描述檔案的檔案夾的路徑,可以是絕對路徑,也可以是相對路徑(相對于 ),預設值為“conf/<engne_name>/<host_name>” |
autoDeploy | 此标志值訓示Tomcat是否應在Tomcat運作時定期檢查新添加的或更新的Web應用程式。 如果為true,則Tomcat會定期檢查appBase和xmlBase目錄,并部署找到的所有新添加的Web應用程式 和重新加載更新的Web應用程,預設值為true |
deployOnStartup | 此标志訓示Tomcat啟動時應自動釋出此虛拟主機的Web應用,預設值為true |
name | 虛拟主機的名稱,可以使用 (例如: ),它會比對該域下所有主機名,除非有完全比對 |
2)标準實作屬性
屬性名 | 描述 |
---|---|
copyXML | 如果想要将嵌入在web應用内的context.xml檔案(位于/META-INF/context.xml)在應用首次啟動時複制到xmlBase中,設定為true。在随後啟動應用程式時,xmlBase中的context配置檔案将會優先被使用,即便web應用内有更新的context配置檔案。預設值為false。注意如果 deployXML設定為fasle,此屬性将無效 |
deployXML | 如果要禁用解析嵌入在web應用内的context.xml檔案(位于/META-INF/context.xml),則設定為false。安全意識環境應将此設定為false以防止應用程式與容器的配置互動。然後,管理者将負責提供外部上下文配置檔案,并将其放在xmlBase屬性定義的位置。如果此标志為false,context配置檔案位于于/META-INF/context.xml,并且xmlBase中不存在context配置檔案,應用程式将無法啟動,因為context.xml可能包含安全部署的必要配置(例如RemoteAddrValve),不應該被忽視。預設值為true,如果啟用安全管理器,預設為false。在安全管理器下運作時,可以通過向web應用程式授予org.apache.catalina.security.DeployXmlPermission來基于每個Web應用程式啟用此功能。預設情況下,Manager和Host Manager應用程式被授予此權限,以便它們在安全管理器下運作時繼續工作。 |
workDir | 臨時目錄檔案夾,預設為 |
3)應用程式自動部署
當使用Host元件的标準實作與預設配置時,appbase中的Web應用程式和xmlbase中的context配置檔案指定的Web應用将會在Tomcat啟動時自動部署(Host元素的
deployOnStartup
屬性預設為true ),并且Tomcat運作時如果檢測到變化将會重新釋出或重新加載Web應用程式(Host元素的
autoDeploy
屬性預設為true )。
當使用自動部署時,虛拟主機appBase和xmlBase中的相關檔案(Web應用程式的context.xml檔案或.war檔案或檔案夾)必須符合期望的命名規則(後面會有具體介紹)。
自動部署過程使用以下搜尋順序識别新的或已修改的Web應用程式:
- 在Host xmlBase中的配置檔案指向的Web應用程式
- 在HostappBase中的還沒有被識别的war格式Web應用程式
- 在Host appBase中的還沒有被識别的檔案夾格式Web應用程式
當Host元素的
autoDeploy
屬性為true時,自動部署程式将會監視web應用的變化。web應用程式将會被重新部署(re-deployed)會重新加載(reloaded),取決于監測到的變化情況。重新部署牽涉到建立新的web應用的情況,如果使用的是标準session manger,使用者session資訊将會丢失。重新加載使用存在的web應用,重新解析其web.xml檔案并重新加載class檔案,如果使用的是标準session manger,使用者session資訊不會丢失。
使用者可以添加檔案到自動部署程式監視的範圍(一旦這些檔案發生改變。會觸發web
應用reloaded),通過添加WatchedResources元素到context.xml 檔案。
當使用自動部署時context.xml中的docBase應在webApp之外,否則自動部署Web應用程式是可能會出問題,或者可能會部署應用程式兩次。
如果在Host元素内嵌Context元素,則應關閉自動部署或小心指定 deployIgnore屬性,否則可能會部署應用程式兩次并且這可能會導緻應用程式出現問題。
3. Context
1)簡介
Context元素代表一個運作在特定虛拟主機上的Web應用,每個Web應用展現為一個War格式檔案或是包含者未壓縮内容的檔案夾。
用于處理每個HTTP請求的Web應用程式由Catalina将Request URI的最長可能字首與每個定義的Context的路徑進行比對來選擇。 選擇後,該Context将根據Web應用程式定義的servlet映射選擇适當的servlet來處理傳入的請求。
可以根據需要定義任意數量的Context元素,每個Context元素必須有虛拟主機内唯一的Context名稱,但Context路徑可以不唯一(并行部署的情況)。可能存在一個Context的路徑是空字元串,此Context将作為此虛拟主機的預設應用,用于處理與虛拟主機内其它Context路徑均無法比對的請求。
2)并行部署
可能會同時出現部署同一個應用程式多個版本的情況,它們的Context路徑相同,用于将請求與Context版本進行比對的規則如下:
- 如果該請求沒有session資訊,将比對最新版本;
- 如果該請求有session資訊,那麼檢查每個版本的session manager進行session比對,比對成功則使用該版本;
- 比對失敗則使用最新版本。
3)命名
當Host的
autoDeploy
或
deployOnStartup
屬性設定為true時,Context的名稱和路徑來源于定義web 應用的檔案的名稱。是以,context的路徑可能沒有在web應用程式中嵌入的META-INF/context.xml中定義的情況下,Context的名稱、路徑、版本和定義web應用的檔案的基檔案名(檔案名去除.war或者.xml字尾)具有緊密的聯系。
如果沒有版本資訊,Context名稱和路徑總是相同的,如果Context路徑為空字元串,那麼基檔案名為ROOT,否則基檔案名為Context路徑去除首個
/
并将後面的
/
替換為
#
。
如果具有版本資訊,Context路徑不變,Context名稱和基檔案名應在末尾添加
##
+版本資訊。一些命名慣例如下圖:
如果想要使用和基檔案名無關的Context路徑部署web應用,那麼需要使用以下方法之一避免重複釋出:
- 設定autoDeploy和 deployOnStartup為false并且在server.xml中定義Context
- 将應用程式檔案夾或war包放在虛拟主機appBase目錄之外,并且在context.xml中通過docBase屬性指向該目錄。
3)定義Context
不建議将Context元素直接定義在server.xml中,因為這使修改Context配置更有侵入性,因為不重新開機Tomcat的情況下無法重新加載server.xml。預設Context元素将會覆寫任何server.xml中的context元素的配置,将context元素的屬性 override 設定為true可以避免。
單個web應用的Context元素可以通過如下方式定義:
- 應用程式内部獨立的/META-INF/context.xml檔案。根據Host元素的copyXML屬性,此檔案可能被複制到$CATALINA_BASE/conf/[enginename]/[hostname]/目錄并且重命名為基檔案名加".xml"擴充名
- $CATALINA_BASE/conf/[enginename]/[hostname]/檔案夾内的獨立的xml檔案,Context的路徑和版本來源于此檔案的基檔案名。此路徑下的xml檔案優先級高于web應用程式内部META-INF檔案夾的context.xml檔案
- conf/server.xml檔案中Host元素内嵌入Context元素
預設Context元素可能被定義用于比對多個web應用:
$CATALINA_BASE/conf/context.xml
檔案中的Context元素配置将被所有應用程式加。
$CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default
檔案中的Context元素資訊将會被目前虛拟主機的所有應用程式加載。
2)屬性
屬性名 | 描述 |
---|---|
docBase | 指定應用程式的實體位置,可以是絕對路徑,也可以是相對路徑(相對于虛拟主機的appBase)。除非Context元素定義在server.xml中或者web應用的實體位置不在Host的appBase,否則這個屬性值不能被設定。如果docBase屬性值包含符号連結,當符号連結改變時,隻有重新開機伺服器或重新部署Context才能生效,重新加載Context是無效的 |
override | 設定為true以忽略全局或主機預設context.xml中的任何設定。 預設情況下,将使用預設context.xml中的設定,但可以通過為Context明确設定相同屬性來覆寫這些設定 |
path | 設定web應用的上下文路徑,用于比對request URI來選擇正确的web應用處理請求。該屬性值隻有在Context元素定義在server.xml中時才可能設定,其他情況将會由Context的xml配置檔案名或docBase推斷。即使是通過server.xml靜态部署Context,隻有在docBase不是Host 的appBase時或者deployOnStartup和autoDeploy 均設定為false時才設定該屬性,否則可能會導緻重複部署 |
reloadable | 設定為true時Catalina将會監視 /WEB-INF/classes/ 和WEB-INF/lib 中的classes的變化,并自動重新加載應用程式,預設值為false |
未完待續…