在本文開始以前,咱們來看一下官方對Tomcat的定義:html
The Apache Tomcat® software is an open source implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies.
Apache Tomcat®是一個開源軟件,實現了Java Servlet、JavaServer Pages、Java Expression Language、Java WebSocket等技術。
Java ™ Servlet Specification中對Servlet的定義爲:web
A servlet is a Java™ technology-based Web component, managed by a container, that generates dynamic content.
Servlet是一個基於Java技術的Web組件,託管在容器中,用於生成動態內容。
對容器的定義爲:數據庫
Containers, sometimes called servlet engines, are Web server extensions that
provide servlet functionality.
容器(也稱Servlet引擎)指可以提供Servlet功能的Web服務器擴展程序。
本文使用的Tomcat版本爲 v8.5.50。
從如今開始,咱們用$CATALINA_HOME
表示Tomcat的安裝目錄,例如:/home/samson/apache-tomcat-8.5.50/
server.xml
指$CATALINA_HOME/conf/server.xml
<Server>
A Server element represents the entire Catalina servlet container.
<Server>
用來表示整個Catalina Servlet容器,因此它必須是server.xml
中惟一的最外層元素。<Server>
包含4個屬性:apache
className
,用來表示所使用的實現類,必須實現org.apache.catalina.Server
接口。若是省略,則使用默認的實現org.apache.catalina.core.StandardServer
。address
,指定接收停機指令的TCP/IP地址,默認爲localhost
。port
,指定接收停機指令的端口號。值爲-1
時,則默認關閉停機端口。shutdown
,指定關機指令。<Service>
A Service element represents the combination of one or more Connector components that share a single Engine component for processing incoming requests.
<Service>
是<Server>
的子標籤之一,是共享同一個<Engine>
的一個或多個<Connector>
的組合。<Service>
包含2個屬性:tomcat
className
,用來表示所使用的實現類,必須實現org.apache.catalina.Service
接口。若是省略,則使用默認的實現org.apache.catalina.core.StandardService
。name
,<Service>
的標識名,同一個<Server>
內的全部<Service>
的name
不可重複。<Engine>
The Engine element represents the entire request processing machinery associated with a particular Catalina Service. It receives and processes all requests from one or more Connectors, and returns the completed response to the Connector for ultimate transmission back to the client.
每一個<Service>
都包含且僅包含一個<Engine>
,表示其所在的<Service>
的請求處理機制。它接收並處理當前<Service>
中全部<Connector>
收到的請求,並返回完整的響應。<Engine>
包含以下6個屬性:服務器
backgroundProcessorDelay
className
,用來表示所使用的實現類,必須實現org.apache.catalina.Engine
接口。若是省略,則使用默認的實現org.apache.catalina.core.StandardEngine
。defaultHost
,默認的主機名,沒法匹配的請求將被重定向到該主機上。jvmRoute
name
,<Engine>
的標識名。當<Server>
中使用多個<Service>
時,每一個<Service>
中的<Engine>
名稱都必須是惟一的。所以,通常將其名稱設置爲其所屬的<Service>
的名稱。startStopThreads
在$CATALINA_HOME/conf
中有與<Engine>
同名的目錄,用於存放它們獨特的配置。網絡
<Connector>
每一個<Service>
中可包含一個或多個<Connector>
,表示接受請求和發送響應的端點。根據協議的不一樣,分爲app
具體信息請參考:The HTTP Connectorwebapp
<Host>
The Host element represents a virtual host, which is an association of a network name for a server (such as "www.mycompany.com") with the particular server on which Tomcat is running.
每一個<Engine>
中能夠有一個或多個<Host>
,每一個都表示一個不一樣的虛擬主機。每一個<Engine>
至少包含一個<Host>
,而且必需經過defaultHost
屬性來指定一個默認<Host>
。jvm
客戶端通常經過主機名來標識其要鏈接的服務器。客戶端發起的請求頭中會包含主機名,Tomcat經過請求頭中的主機名選擇與其匹配的主機,若是找不到匹配主機,則選擇默認主機(即經過defaultHost
指定的主機)。
今後刻起,用$CATALINA_BASE
指代設置的Tomcat的基準地址,若是未部署多個Tomcat實例,$CATALINA_BASE
的值與$CATALINA_HOME
一致。
<Host>
的經常使用屬性包括:
appBase
,用來指定此虛擬主機的應用程序基本目錄。能夠是絕對路徑,或到$CATALINA_BASE
的相對路徑。其默認值爲$CATALINA_HOME/webapps
name
,一般設置爲虛擬主機的網絡名,與在DNS註冊的名稱一致。不區分大小寫,tomcat會將其轉爲小寫。<Context>
The Context element represents a web application, which is run within a particular virtual host.
<Context>
能夠在<Host>
中嵌套使用,用來表示一個Web應用程序。每一個Web應用程序能夠是Web Application Archive(WAR)文件,或包含特定結構的文件夾。關於Web應用程序更多的信息,請參考 Application Developer's Guide。
Catalina經過比較請求的URI和<Context>
的context path
來選擇由哪一個Web應用來處理這個請求。而且會根據Web應用程序中web.xml
定義的規則,來選擇某個Servlet來具體處理這個請求。每一個<Host>
中,全部<Context>
的名稱都必須惟一,但它們的context path
卻沒必要。並且,必須存在一個context path
爲空字符串(即長度爲0)的<Context>
,做爲默認Web應用程序,例如$CATALINA/webapps/ROOT
。默認Web應用程序用來處理沒法與任何context path
所匹配的請求。
同一個context path
能夠同時部署同一個Web應用的多個版本,匹配請求URI的規則以下:
當<Host>
進行autoDeploy
或deployOnStartup
時,context path
會根據WAR文件、xml文件、或表示Web應用的目錄生成。context path
、context version
、context name
、base file name
(指取出.xml
、.war
後綴的文件名)的關係以下:
context path |
context version |
context name |
base file name |
example file name |
---|---|---|---|---|
/foo | None | /foo | foo | foo.xml, foo.war, foo |
/foo/bar | None | /foo/bar | foo#bar | foo#bar.xml, foo#bar.war, foo#bar |
empty string | None | empty string | ROOT | ROOT.xml, ROOT.war, ROOT |
/foo | 42 | /foo##42 | foo##42 | foo##42.xml, foo##42.war, foo##42 |
/foo/bar | 42 | /foo/bar##42 | foo#bar##42 | foo#bar##42.xml, foo#bar##42.war, foo#bar##42 |
empty string | 42 | ##42 | ROOT##42 | ROOT##42.xml, ROOT##42.war, ROOT##42 |
context version
比較是按照字符串的方式進行的,即foo.war
被認爲是比foo##11.war
舊的版本,foo#11.war
被認爲是比foo##2.war
舊的版本。
若是不想讓Tomcat根據base file name
自動推斷出context name
等信息,可經過以下方式之一實現:
autoDeploy
和deployOnStartup
置爲false
,並在server.xml
中定義全部的Web應用<Host>
的appBase
目錄以外,並在%CATALINA_HOME/conf/[engine_name]/context.xml
,並用docBase
指定。It is NOT recommended to place<Context>
elements directly in the server.xml file.
不建議在server.xml
中直接用<Context>
定義。
今後處開始,用$APP_BASE
表示某個Web應用程序的根目錄
$CATALINA_HOME/conf/server.xml
的修改必需要重啓Tomcat才能應用。Context能夠分爲兩類:
Individual Context
,定義在以下位置中:
$APP_BASE/META-INF/context.xml
,根據<Host>
配置的屬性copyXML
,將把該文件拷貝到$CATALINA_HOME/conf/[engine name]/[host name]
目錄下,並重命名爲[base file name].xml
$CATALINA_HOME/conf/[engine name]/[host name]/[base file name].xml
,該文件優先於任何$APP_BASE/META-INF/context.xml
$CATALINA_HOME/conf/server.xml
中的<Context>
Default Context
,定義在以下位置中:
$CATALINA_HOME/conf/context.xml
,定義的元素會被全部的Web應用程序加載$CATALINA_HOME/conf/[engine name]/[host name]/context.xml.default
,定義的元素會被當前<Host>
上運行的全部Web應用程序加載除了server.xml
外,其餘的每一個文件都只能定義一個<Context>
。更多具體的信息,請參考The Context Container。
<Realm>
<Realm>
能夠在<Engine>
、<Host>
或Context
中嵌套使用,表示包含用戶名、密碼和角色信息的數據庫,用於實現Container Managed Security。<Realm>
的經常使用屬性爲:
className
,用來表示所使用的實現類,必須實現org.apache.catalina.Realm
接口。Tomcat提供多個標準實現:
org.apache.catalina.realm.JDBCRealm
org.apache.catalina.realm.DataSourceRealm
org.apache.catalina.realm.JNDIRealm
org.apache.catalina.realm.UserDatabaseRealm
org.apache.catalina.realm.MemoryRealm
org.apache.catalina.realm.JAASRealm
org.apache.catalina.realm.CombinedRealm
org.apache.catalina.realm.LockOutRealm
org.apache.catalina.realm.NullRealm
關於<Realm>
的更多詳細信息,請參考The Realm Component。