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,则是””-。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。