Tomcat中配置文件server.xml详解

书欣 Java经验 发布时间:2023-01-27 10:45:41 阅读数:5282 1
下文笔者讲述Tomcat中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,则是””-。

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202301/16747875915529.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者