server.xml in tomcat

server.xml in tomcat

1. 預備知識

在本文開始以前,咱們來看一下官方對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服務器擴展程序。

2. server.xml

本文使用的Tomcat版本爲 v8.5.50

從如今開始,咱們用 $CATALINA_HOME表示Tomcat的安裝目錄,例如: /home/samson/apache-tomcat-8.5.50/

server.xml$CATALINA_HOME/conf/server.xml

2.1 <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,指定關機指令。

2.2 <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不可重複。

2.3 <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>同名的目錄,用於存放它們獨特的配置。網絡

2.4 <Connector>

每一個<Service>中可包含一個或多個<Connector>,表示接受請求和發送響應的端點。根據協議的不一樣,分爲app

  • HTTP/1.1
  • HTTP/2
  • AJP

具體信息請參考:The HTTP Connectorwebapp

2.5 <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會將其轉爲小寫。

2.6 <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>進行autoDeploydeployOnStartup時,context path會根據WAR文件、xml文件、或表示Web應用的目錄生成。context pathcontext versioncontext namebase 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等信息,可經過以下方式之一實現:

  • autoDeploydeployOnStartup置爲false,並在server.xml中定義全部的Web應用
  • 把WAR文件或表明Web應用的目錄文件放置在<Host>appBase目錄以外,並在%CATALINA_HOME/conf/[engine_name]/context.xml,並用docBase指定。

如何定義一個Context

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

2.7 <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

相關文章
相關標籤/搜索