Tomcat中的大多数配置都会在server.xml文件中,server.xml的地位就好像nginx中的nginx.conf文件,因此我们想要学习配置tomcat的各类参数,最先开始学习的配置就是server.xml文件。

1、server.xml整体架构

首先我们需要知道server.xml中的xml代码块分类,tomcat官网将其主要分为四类:

  • Top Level Elements:server块是整个配置文件的根元素,而service块代表与引擎关联的一组连接器(connector)。
  • Connectors :表示外部客户端向特定服务发送请求和接收响应的接口(比如我们之前提到的coyote连接器以及对应的NIO等IO模式都是整个范畴内的概念)。
  • Containers:容器(Container)负责处理传入的请求并创建相应的响应。Engine处理对Service的所有请求,Host处理对特定virtual host的所有请求,而Context处理对特定Web应用程序的所有请求。
  • Nested Components:表示可以嵌套在Container元素内的元素。 注意一些元素可以嵌套在任何Container中,而另一些元素只能嵌套在Context中。

2、Top Level Elements

2.1 Server块

Server块代表的是整个catalina servlet容器。因此,它必须是conf/server.xml配置文件中最外面的单个元素。它的属性代表了整个servlet容器的特征。Tomcat9中默认的配置文件中Server块内嵌的子元素为 Listener、GlobalNamingResources、Service(可以嵌套多个)。具体的每个属性参数我们可以查询官网,下面解释默认的参数配置。

<Server port="8005" shutdown="SHUTDOWN">
    <!--
        port : Tomcat监听的关闭服务器的端口 
        shutdown : 关闭服务器的指令字符串
     -->

    <!-- 以日志形式输出服务器、操作系统、JVM的版本信息 -->
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />

    <!-- 启动和停止APR。如果找不到APR库会输出日志但并不影响tomcat正常启动 -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
    <!-- 
        注意这里的SSLEngine默认是打开的(on)
        如果启用了apr作为连接器的协议
        但是只配置了http而没有配置https
        则会报错    
    -->

    <!-- 用于避免JRE内存泄漏问题 --> 
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

    <!-- 用户加载(服务器启动)和销毁(服务器停止)全局命名服务 -->
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

    <!-- 用于在Context停止时重建Executor池中的线程, 以避免ThreadLocal相关的内
存泄漏 -->
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

    <!-- GlobalNamingResources中定义了全局命名服务: -->
  <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" />
              <!--这里定义的文件就是我们前面配置manager和host manager的用户的文件-->
  </GlobalNamingResources>

  <Service>
    ...
  </Service>

 </Server>

2.2 Service块

Service元素用于创建 Service 实例,默认使用 org.apache.catalina.core.StandardService。 默认情况下,Tomcat9中默认仅指定了Service的名称为Catalina。

<Service name="Catalina">
...
</Service>

Service 可以内嵌的元素为 : Listener、Executor、Connector、Engine ,详细的参数可以点击这里查看官网

  • Listener 用于为Service 添加生命周期监听器
  • Executor 用于配置Service 共享线程池
  • Connector 用于配置 Service 包含的链接器
  • Engine 用于配置Service中连接器(connector)对应的Servlet 容器引擎

2.3 Executor

executor表示可组件之间Tomcat中共享的线程池。默认情况下,Service并未添加共享线程池配置。executor实现了tomcat中的org.apache.catalina.Executor接口。 如果不配置共享线程池,那么Catalina 各组件在用到线程池时会独立创建。由于executor是Service元素的嵌套元素。为了使它能够被Connector使用,Executor元素必须出现在server.xml中的Connector元素之前。下面展示的是一个简单的executor的配置,具体的配置参数可以点这里查看官网:

<Executor name="tomcatThreadPool"
    namePrefix="catalina‐exec‐"
    maxThreads="200"
    minSpareThreads="100"
    maxIdleTime="60000"
    maxQueueSize="Integer.MAX_VALUE"
    prestartminSpareThreads="false"
    threadPriority="5"
    className="org.apache.catalina.core.StandardThreadExecutor"/>

 

2.4 Connector

Connector 用于创建链接器实例。默认情况下,server.xml 配置了两个链接器,一个支 持HTTP协议,一个支持AJP协议。因此大多数情况下,我们并不需要新增链接器配置, 只是根据需要对已有链接器进行优化。

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
  • port为监听的端口,如果设置为0,Tomcat将会随机选择一个可用的端口号给当前Connector 使用

  • protocol为Connector的协议,这里默认的是HTTP和AJP两种协议,后面可以指定对应协议的不同版本,默认情况下会检测本机是否配置了APR库,如果有并且 useAprConnector设置为true则会默认使用APR模式的IO协议,如果无则会使用NIO模式

  • connectionTimeOut :Connector 接收链接后的等待超时时间,单位为毫秒。 -1表示永不超时

  • redirectPort:当前Connector 不支持SSL请求, 接收到了一个请求, 并且也符合 security-constraint 约束, 需要SSL传输,Catalina自动将请求重定向到指定的端口

  • executor : 指定前面提到的共享线程池的名称,也可以通过maxThreads、minSpareThreads 等属性对该connector进行单独配置对应的内部线程池

  • URIEncoding : 用于指定编码URI的字符编码, Tomcat8.x和Tomcat9.x版本默认的编码为 UTF-8 , Tomcat7.x版本默认为ISO-8859-1

2.5 Engine

Engine 作为Servlet 引擎的顶级元素,内部可以嵌入: Cluster、Listener、Realm、 Valve和Host。

<Engine name="Catalina" defaultHost="localhost">
    ……
</Engine>
  • name:用于指定Engine 的名称, 默认为Catalina
  • defaultHost:默认使用的虚拟主机名称,当客户端请求访问的host无效时,会跳转到默认的host来处理请求

2.6 Host

Host 元素用于配置一个虚拟主机,它支持以下嵌入元素:Alias、Cluster、Listener、 Valve、Realm、Context

如果在Engine下配置Realm,那么此配置将在当前Engine下的所有Host中共享。 同样,如果在Host中配置Realm ,则在当前Host下的所有Context 中共享

Context中的Realm优先级 > Host的Realm优先级 > Engine中的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 &quot;%r&quot; %s %b" />
    <Alias>www.example.com</Alias>
    <Alias>www.example2.com</Alias>
</Host>

上面这一段Host的配置文件中还额外添加了Valve配置来实现自定义的日志记录。其中一些参数的详细信息和配置方式可以查看官网的说明

  • name: 当前Host通用的网络名称,也就是常用的域名,如果有多个域名对应同一个Host的应用,我们可以设置一个或多个Alias来实现访问

  • appBase:当前Host应用对应的目录,当前Host上部署的Web应用均在该目录下(相对路径和绝对路径均可),默认为webapps

  • unpackWARs:设置为true,Host在启动时会将appBase目录下war包解压为目 录。设置为false,Host将直接从war文件启动

  • autoDeploy: 控制tomcat是否在运行时定期检测并自动部署新增或变更的web应用

2.7 Context

Context 用于配置一个Web应用,默认的配置如下。它支持的内嵌元素为:CookieProcessor,Loader,Manager,Realm,Resources,WatchedResource,JarScanner,Valve。

<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="true">
    <Context docBase="myAppDeploy" path="/myApp">
    ....
    </Context>
</Host>
  • docBase:Web应用目录或者War包的部署路径。可以是绝对路径,也可以是相对于该Context所属的Host中的appBase的相对路径。
  • path:Web应用的Context的访问路径。

假设tomcat的安装目录为/home/tomcat9,Host为默认的localhost, 则该web应用访问的根路径为: http://localhost:8080/myApp, 对应的部署文件所存放的路径为:/home/tomcat9/webapps/myAppDeploy。

原创文章,转载请注明出处:http://b.nwumba.cn/article/120/