Tomcat中配置文件server.xml详解
下文笔者讲述Tomcat中server.xml详解说明,如下所示
如下所示
server.xml中配置多个服务的示例
Tomcat简介
Tomcat这个开源软件属于Apache基金会 它是一个开源的轻量级Web应用服务器 目前在市面上使用非常多,我们经常使用tomcat运行java程序 server.xml简介 server.xml是Tomcat中最重要的配置文件,用于对tomcat进行相应的配置 server.xml默认存放在$TOMCAT_HOME/conf目录中 server.xml是一个符合xml规范的文件,她里面的标签都对应相应的组件,我们对xml文件中进行相应的设置 即可对tomcat中组件进行相应的设置,那么server.xml中有哪些设置,下文笔者将一一道来,如下所示
server.xml基础示例分享
<Server port="8008" shutdown="SHUTDOWN">
<listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<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 name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<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" />
</Host>
</Engine>
</Service>
</Server>
server.xml文档的元素分类和整体结构
整体结构
server.xml整体结构如下所示
<Server>
<Service>
<Connector />
<Connector />
<Engine>
<Host>
<Context /><!-- 现在常常使用自动部署,不推荐配置Context元素,Context小节有详细说明 -->
</Host>
</Engine>
</Service>
</Server>
以上的server.xml只定义Tomcat核心组件
Server.xml中元素分类
server.xml文件中的元素
可分为以下4类:
1.顶层元素:<Server>和<Service>
<Server>元素是整个配置文件的根元素
<Service>元素则代表一个Engine元素及一组与之相连的Connector元素。
2.连接器:<Connector>
<Connector>代表外部客户端发送请求到特定Service的接口
同时也是外部客户端从特定Service接收响应的接口。
3.容器:<Engine><Host><Context>
容器的功能:
处理Connector接收进来的请求
并产生相应的响应
Engine、Host和Context都是容器
但它们不是平行的关系,而是父子关系:
Engine包含Host,Host包含Context
一个Engine组件可以处理Service中的所有请求
一个Host组件可以处理发向一个特定虚拟主机的所有请求
一个Context组件可以处理一个特定Web应用的所有请求
4.内嵌组件:
可以内嵌到容器中的组件
如:Server、Service、Connector、Engine、Host和Context是最重要的最核心的Tomcat组件
其他组件则可以定义为内嵌组件
核心组件
Server
Server元素定义在最顶层
指整个Tomcat容器
因此它必须是server.xml中唯一一个最外层的元素
一个Server元素中可以有一个或多个Service元素。
在最外层有一个<Server>元素
shutdown属性表示关闭Server的指令
port属性表示Server接收shutdown指令的端口号
设为-1可以禁掉该端口
Server的功能:
提供一个接口让客户端能够访问到这个Service集合
同时维护它所包含的所有的Service的声明周期
如:如何初始化、如何结束服务、如何找到客户端要访问的Service
Service
Service的功能: 在Connector和Engine外面包了一层 将它们组装在一起,对外提供服务 一个Service可以包含多个Connector 但只能包含一个Engine Connector的功能是从客户端接收请求 Engine的功能是处理接收进来的请求 如上例中Server中包含一个名称为“Catalina”的Service 实际上,Tomcat可以提供多个Service,不同的Service监听不同的端口
Connector
Connector的功能:
用于接收连接请求
创建Request和Response对象用于和请求端交换数据
然后分配线程让Engine来处理这个请求
并将产生的Request和Response对象传给Engine。
运用配置Connector,可控制请求Service的协议及端口号
如上例中,Service包含两个Connector:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8090" protocol="AJP/1.3" redirectPort="8443" />
使用配置第1个Connector,客户端可以通过8080端口号使用http协议访问Tomcat
其中protocol属性规定了请求的协议
port设置请求的端口号
redirectPort表示当强制要求https而请求是http时
重定向至端口号为8443的Connector,connectionTimeout表示连接的超时时间。
上例中Tomcat监听HTTP请求,运用8080端口
注意事项:
在实际的生产环境中
Tomcat也常常监听8080端口
而不是80端口
这是因为在生产环境中
很少使用Tomcat直接对外开放接收请求,而在Tomcat和客户端之间加一层代理服务器(如nginx)
用于请求的转发、负载均衡、处理静态文件等
使用代理服务器访问Tomcat时,但是在局域网中,可继续使用8080端口
使用配置第2个Connector,客户端可使用8090端口号使用AJP协议访问Tomcat
AJP协议负责和其他的HTTP服务器(如Apache)建立连接
当把Tomcat与其他HTTP服务器集成时,此时就需要使用AJP连接器(由于tomcat是一个Servlet/jsp容器,对静态资源处理速度慢)
常常将两者进行集成,AJP协议就是将Tomcat和Apache进行连接
Engine
Engine组件
在Service组件中有且只有一个
Engine是Service组件中的请求处理组件
Engine组件从一个或多个Connector中接收请求并处理
并将完成的响应返回给Connector
最终通过Connector传递给客户端
Engine中包含Host,Host包含Context。
例:
<Engine name="Catalina" defaultHost="localhost">
其中
name属性用于日志和错误信息
在整个Server中应该唯一
defaultHost属性设置默认host名称
当发往本机的请求指定的host名称不存在时
一律使用defaultHost指定的host进行处理
所以defaultHost值,必须与Engine中的一个Host组件的name属性值匹配。
Host
Engine和Host
Host是Engine的子容器
Engine组件中可以内嵌1个或多个Host组件
每个Host组件代表Engine中的一个虚拟主机
Host组件至少有一个
且其中一个的name必须与Engine组件的defaultHost属性相匹配。
Host功能
Host虚拟主机的功能,
当运行多个Web应用(一个Context代表一个Web应用)
并负责安装、展开、启动和结束每个Web应用。
Host组件代表的虚拟主机
对应服务器中一个网络名实体(如”www.java265.com”,或IP地址”8.8.8.8”)
为了使用户可以通过网络名连接Tomcat服务器,"www.java265.com"名字应该在DNS服务器上注册
客户端通常使用主机名来标识它们希望连接的服务器
该主机名也会包含在HTTP请求头中
Tomcat从HTTP头中提取出主机名,寻找名称匹配的主机
当没有匹配成功,请求将发送至默认主机
因此默认主机不需要是在DNS服务器中注册的网络名
所以任何与所有Host名称不匹配的请求,都会路由至默认主机。
Host配置示例
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
name属性:
指定虚拟主机的主机名
一个Engine中有且仅有一个Host组件的name属性与Engine组件的defaultHost属性相匹配
通常情况下
主机名需要是在DNS服务器中注册的网络名
但是Engine指定的defaultHost不需要
unpackWARs设置是否将代表Web应用的WAR文件解压
如果为true,通过解压后的文件结构运行该Web应用
如果为false,直接使用WAR文件运行Web应用
Host中autoDeploy和appBase属性
与Host内Web应用的自动部署有关
Context的功能
Context的功能
Context元素代表在特定虚拟主机上运行的一个Web应用
每个Web应用基于WAR文件,或WAR文件解压后对应的目录
Context是Host的子容器
每个Host中可以定义任意多的Context元素
Web应用自动部署
要开启Web应用的自动部署 需要配置所在的虚拟主机 配置的方式就是前面提到的Host元素的deployOnStartup和autoDeploy属性 当deployOnStartup和autoDeploy设置为true,则tomcat启动自动部署 当检测到新的Web应用或Web应用的更新时,会触发应用的部署(或重新部署)
deployOnStartup和autoDeploy区别:
deployOnStartup为true时,Tomcat在启动时检查Web应用,且检测到的所有Web应用视作新应用
autoDeploy为true时,Tomcat在运行时定期检查新的Web应用或Web应用的更新
检查Web应用更新
一个Web应用可能包括以下文件 XML配置文件,WAR包及一个应用目录(该目录包含Web应用的文件结构) 其中XML配置文件位于xmlBase指定的目录 WAR包和应用目录位于appBase指定的目录 Tomcat按照如下的顺序进行扫描,来检查应用更新 1.扫描虚拟主机指定的xmlBase下的XML配置文件 2.扫描虚拟主机指定的appBase下的WAR文件 3.扫描虚拟主机指定的appBase下的应用目录
Context元素中两个重要属性:docBase和path
和reloadable属性
docBase:
设置Web应用使用的WAR包路径或应用目录
注意事项:
在自动部署场景下
docBase不在appBase目录中,才需要指定
当docBase指定的WAR包或应用目录就在appBase中,则无需指定
path:
设置访问该Web应用的上下文路径
当请求到来时,Tomcat根据Web应用path属性与URI的匹配程度来选择Web应用处理相应请求
例:
Web应用app1的path属性是”/app1”
Web应用app2的path属性是”/app2”
则请求/app1/index.html会交由app1来处理
请求/app2/index.html会交由app2来处理
当一个Context元素的path属性为””,那么这个Context是虚拟主机的默认Web应用
当请求的uri与所有的path都不匹配时,使用该默认Web应用来处理。
注意事项:
在自动部署场景下,不能指定path属性
path属性由配置文件的文件名、WAR文件的文件名或应用目录的名称自动推导出来
如扫描Web应用时,发现了xmlBase目录下的app1.xml,或appBase目录下的app1.WAR或app1应用目录
则该Web应用的path属性是”app1”
如果名称不是app1而是ROOT,则该Web应用是虚拟主机默认的Web应用,此时path属性推导为””。
reloadable属性:
指tomcat是否在运行时监控在WEB-INF/classes和WEB-INF/lib目录下class文件的改动
当此值为true,那么当class文件改动时,会触发Web应用的重新加载
在开发环境下,reloadable设置为true便于调试
但在生产环境中设置为true会给服务器带来性能压力,因此reloadable参数的默认值为false。
自动部署的示例
<Context docBase="D:\Test\app1.war" reloadable="true"/>配置说明
docBase位于Host的appBase目录之外 由于path属性没有指定 会根据app1.xml自动推导为”app1” 由于是在开发环境下 因此reloadable设置为true,便于开发调试
核心组件的关联
整体关系
核心组件之间的整体关系
Server元素在最顶层
代表整个Tomcat容器
一个Server元素中可以有一个或多个Service元素。
Service在Connector和Engine外层,将它们组装在一起,对外提供服务
一个Service可以包含多个Connector
但只能包含一个Engine
Connector接收请求,Engine处理请求
Engine、Host和Context都是容器
且Engine包含Host,Host包含Context
每个Host组件代表Engine中的一个虚拟主机
每个Context组件代表在特定Host上运行的一个Web应用。
Tomcat路由判断方法
当请求被发送到Tomcat所在的主机时
我们可以使用以下方法判断具体处理此请求的web应用
1.使用协议和端口号选定Service和Engine
Service中的Connector组件可以接收特定端口的请求
当Tomcat启动时,Service组件就会监听特定的端口
如:
Catalina这个Service监听了8080端口(基于HTTP协议)和8090端口(基于AJP协议)
当请求进来时,Tomcat便可以根据协议和端口号选定处理请求的Service
当Service选择后,Engine也随之确认
2.根据域名或IP地址选定Host
Service确定后
Tomcat在Service中寻找名称与域名/IP地址匹配的Host处理该请求
当没有找到,则使用Engine中指定的defaultHost来处理该请求
如:
上例中只有一个Host(name属性为localhost)
因此该Service/Engine的所有请求都交给该Host处理。
3.使用URI选定Context/Web应用
Tomcat根据应用的 path属性与URI的匹配程度来选择Web应用处理相应请求
例
浏览器中输入http://localhost:8080/app1/index.html
先通过协议和端口号(http和8080)选定Service
然后通过主机名(localhost)选定Host
然后通过uri(/app1/index.html)选定Web应用
Tomcat中如何配置多个服务
在Server中配置多个Service服务 可实现通过不同的端口号来访问同一台机器上部署的不同Web应用例:
server.xml中配置多个服务的示例
1.复<Service>元素,放在当前<Service>后面。
2.修改端口号:根据需要监听的端口号修改<Connector>元素的port属性;
必须确保该端口没有被其他进程占用,否则Tomcat启动时会报错,而无法通过该端口访问Web应用。
可使用以下方法找出某个端口是否被其他进程占用
netstat -aon|findstr "8081"发现8081端口被PID为6632的进程占用
tasklist |findstr "6632"发现该进程为testJava.exe(这是McAfee杀毒软件的进程)。
3.修改Service和Engine的name属性
4.修改Host的appBase属性(如webapps2)
5.Web应用仍然使用自动部署
6.将要部署的Web应用(WAR包或应用目录)拷贝到新的appBase下。
多个Service的配置
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<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 name="Catalina">
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="/opt/project/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" />
</Host>
</Engine>
</Service>
<Service name="Catalina2">
<Connector port="8084" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina2" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="/opt/project/webapps2" 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" />
</Host>
</Engine>
</Service>
</Server>
将原webapps下的docs目录拷贝到webapps2中
然后可通过如下两个接口都可以访问docs应用
http://localhost:8080/docs/
http://localhost:8084/docs/
其他组件
Listener
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
Listener(即监听器)定义的组件:
可以在特定事件发生时执行特定的操作
被监听的事件通常是Tomcat的启动和停止
监听器可以在Server、Engine、Host或Context中
本例中的监听器都是在Server中
实际上
本例中定义的6个监听器
都只能存在于Server组件中
注意事项:
1.监听器不允许内嵌其他组件
2.监听器需要配置的最重要的属性是className
该属性设置监听器的具体实现类
3.该类必须实现org.apache.catalina.LifecycleListener接口。
tomcat监听器的示例分享
VersionLoggerListener:
当Tomcat启动时,该监听器记录Tomcat、Java和操作系统的信息
该监听器必须是配置的第一个监听器。
AprLifecycleListener:
Tomcat启动时,检查APR库,如果存在则加载。APR,即Apache Portable Runtime
是Apache可移植运行库,可以实现高可扩展性、高性能,以及与本地服务器技术更好的集成。
JasperListener:
在Web应用启动之前初始化Jasper
Jasper是JSP引擎
把JVM不认识的JSP文件解析成java文件
然后编译成class文件供JVM使用。
JreMemoryLeakPreventionListener:
与类加载器导致的内存泄露有关。
GlobalResourcesLifecycleListener:
使用该监听器,初始化< GlobalNamingResources>标签中定义的全局JNDI资源
当没有该监听器,任何全局资源都不能使用。< GlobalNamingResources>将在后文介绍。
ThreadLocalLeakPreventionListener:
当Web应用因thread-local导致的内存泄露而要停止时,
该监听器会触发线程池中线程的更新。
当线程执行完任务被收回线程池时,
活跃线程会一个一个的更新。
只有当Web应用(即Context元素)的renewThreadsWhenStoppingContext属性设置为true时,该监听器才有效。
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
Realm:
可以把它理解成“域”
Realm提供了一种用户密码与web应用的映射关系
从而实现角色安全管理的作用
<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>
GlobalNamingResources元素定义全局资源
使用配置可看出
该配置是通过读取$TOMCAT_HOME/ conf/tomcat-users.xml实现的。
Valve
Host元素内定义Valve组件
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log."
suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
Valve: 在Tomcat中代表了请求处理流水线上的一个组件
Valve可以与Tomcat的容器(Engine、Host或Context)关联。
例:
不同的Valve有不同的特性
下面介绍一下本例中出现的AccessLogValve。
AccessLogValve的功能:
使用日志记录其所在的容器中处理的所有请求
在本例中
Valve放在Host下
便可以记录该Host处理的所有请求
AccessLogValve记录的日志就是访问日志
每天的请求会写到一个日志文件里
AccessLogValve可与Engine、Host或Context关联
例:
只有一个Engine,Engine下只有一个Host
Host下只有一个Context
例AccessLogValve属性的配置
使用的是默认的配置,AccessLogValve中各个属性功能
1.className:规定了Valve的类型,是最重要的属性
例:通过该属性规定了这是一个AccessLogValve。
2.directory:指定日志存储的位置
例:日志存储在$TOMCAT_HOME/logs目录下。
3.prefix:设置日志文件的前缀。
4.suffix:设置日志文件的后缀
使用directory、prefix和suffix的配置
在$TOMCAT_HOME/logs目录下
5.pattern:设置记录日志的格式
%h:远程主机名或IP地址
当有nginx等反向代理服务器进行请求分发
该主机名/IP地址代表的是nginx,否则代表的是客户端
%l:远程逻辑用户名,一律是”-”
%u:授权的远程用户名,如果没有,则是”-”。
%t:访问的时间。
%r:请求的第一行,即请求方法(get/post等)、uri、及协议。
%s:响应状态,200,404等等。
%b:响应的数据量,不包括请求头,如果为0,则是””-。
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
Realm:
可以把它理解成“域”
Realm提供了一种用户密码与web应用的映射关系
从而实现角色安全管理的作用
<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>
GlobalNamingResources元素定义全局资源
使用配置可看出
该配置是通过读取$TOMCAT_HOME/ conf/tomcat-users.xml实现的。
Valve
Host元素内定义Valve组件
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log."
suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
Valve: 在Tomcat中代表了请求处理流水线上的一个组件
Valve可以与Tomcat的容器(Engine、Host或Context)关联。
例:
不同的Valve有不同的特性
下面介绍一下本例中出现的AccessLogValve。
AccessLogValve的功能:
使用日志记录其所在的容器中处理的所有请求
在本例中
Valve放在Host下
便可以记录该Host处理的所有请求
AccessLogValve记录的日志就是访问日志
每天的请求会写到一个日志文件里
AccessLogValve可与Engine、Host或Context关联
例:
只有一个Engine,Engine下只有一个Host
Host下只有一个Context
例AccessLogValve属性的配置
使用的是默认的配置,AccessLogValve中各个属性功能
1.className:规定了Valve的类型,是最重要的属性
例:通过该属性规定了这是一个AccessLogValve。
2.directory:指定日志存储的位置
例:日志存储在$TOMCAT_HOME/logs目录下。
3.prefix:设置日志文件的前缀。
4.suffix:设置日志文件的后缀
使用directory、prefix和suffix的配置
在$TOMCAT_HOME/logs目录下
5.pattern:设置记录日志的格式
%h:远程主机名或IP地址
当有nginx等反向代理服务器进行请求分发
该主机名/IP地址代表的是nginx,否则代表的是客户端
%l:远程逻辑用户名,一律是”-”
%u:授权的远程用户名,如果没有,则是”-”。
%t:访问的时间。
%r:请求的第一行,即请求方法(get/post等)、uri、及协议。
%s:响应状态,200,404等等。
%b:响应的数据量,不包括请求头,如果为0,则是””-。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


