<?xml version="1.0" encoding="UTF-8"?>
<Server>
:定义 Tomcat 服务器的顶级元素,包含一个或多个 <Service>
元素。
在最外层有一个<Server>元素,shutdown属性表示关闭Server的指令; port属性表示Server接收shutdown指令的端口号,设为-1可以禁掉该端口。
Server的主要任务,就是提供一个接口让客户端能够访问到这个Service集合,同时维护它所包合的所有的Sevice的声明周期,包括如何初始化、如何结束服务、如何找到客户端要访问的Service。
<Server port="8005" shutdown="SHUTDOWN">
<Listener>
:定义一个监听器,用于监听 Tomcat 服务器的事件,如应用程序启动、关闭等。
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service>
:定义一个 Tomcat 服务,通常包含一个或多个 <Connector>
元素和一个 <Engine>
元素。
Service的作用,是在Connector和Engine外面包了一层,把它们组装在一起,对外提供服务。一个Service可以包含多个Connector,但是只能包含一个Engine; 其中Connector的作用是从客户端接收请求,Engine的作用是处理接收进来的请求。Server中包含一个名称为“Catalina"”的Service。实际上,Tomcat可以提供多个Service不同的Service监听不同的端口。
<Service name="Catalina">
<Connector>
:定义 Tomcat 服务器监听的网络连接器,用于接收和处理客户端的请求。可以配置协议、端口号、SSL 加密等。
Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据: 然后分配线程让Engine来处理这个请求,并把产生的Request和Response对象传给Engine。
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine>
:定义一个 Tomcat 引擎,用于处理接收到的请求。通常包含一个或多个 <Host>
元素。
Engine组件在Service组件中有且只有一个; Engine是Service组件中的请求处理组件。Engine组件从一个或多个Connector中接收请求并处理,并将完成的响应返回给Connector,最终传递给客户端。Engine、Hos和Context都是容器,但它们不是平行的关系,而是父子关系: Engine包含HoHost包含Context。name属性用于日志和错误信息,在整个Server中应该唯一。defaultHost属性指定了默认的host名称,当发往本机的请求指定的host名称不存在时,一律使用defaultHost指定的host进行处理:因此,defaultHost的值必须与Engine中的一个Host组件的name属性值匹配。
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host>
:定义一个虚拟主机,用于处理特定域名或 IP 地址的请求。可以配置多个虚拟主机。
name属性指定虚拟主机的主机名,一个Engine中有且仅有一个Host组件的name属性与Engine组件的defaultHost属性相匹配;一般情况下,主机名需要是在DNS服务器中注册的网络名,但是Engine指定的defaultHost不需要。unpackWARs指定了是否将代表Web应用的WAR文件解压; 如果为true,通过解压后的文件结构运行该Web应用,如果为false,直接使用WAR文件运行Web应用。Host的autoDeploy和appBase属性,与Host内Web应用的自动部署有关; 此外,本例中没有出现的xmlBase和deployOnStartup属性,也与Web应用的自动部署有关。
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<Context>
:定义一个 Web 应用程序的上下文,包含了该应用程序的配置信息,如上下文路径、文档根目录、会话管理等。
Context元素代表在特定虚拟主机上运行的一个Web应用。在后文中,提到Context、应用或Web应用,它们指代的都是Web应用。每个Web应用基于WAR文件,或WAR文件解压后对应的目录(这里称为应用目录)。Context是Host的子容器,每个Host中可以定义任意多的Context元素。看server.xm配置文件中并没有出现Context元素的配置,这是因为,Tomcat开启了自动部署,Web应用没有在server.xml中配置静态部署,而是由Tomcat通过特定的规则自动部署。
<!-- <Context docBase="E:\IdeaProjects\web_demo\src\main\webapp" path="/"/> -->
其他:
<Realm>
:定义一个安全领域,用于进行用户认证和授权。可以配置多种类型的领域,如 JDBCRealm、JNDIRealm 等。
<Valve>
:定义一个阀门,用于在请求处理的不同阶段执行特定的操作,如访问日志记录、IP 过滤等。
</Host>
</Engine>
</Service>
</Server>