在本文开始以前,咱们来看一下官方对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。