基本概念
  • Tomcat的服务器配置主要集中于tomcat/conf下的文件:
    • catalina.policy
    • catalina.properties
    • context.xml
    • server.xml
    • tomcat-user.xml
    • web.xml
server.xml
  • server.xmlTomcat的核心配置文件,包含了TomcatServlet容器Catalina的所有配置

Server

  • Serverserver.xml的根元素,用于创建一个Server实例,默认使用的实现类是org.apache.catalina.core.standardServer
<server port="8005" shutdown="SHUTDOWN">
	...
</server>
  • port: Tomcat监听关闭服务的接口
  • shutdown: 关闭服务器的指令字符串
  • Server中内嵌的子元素为Listener, GlobalNamingResources, Service
  • Server中默认配置5个监听器Listener:
<!-- 用于以日志形式输出服务器,操作系统,JVM的版本信息 -->
<Listener className="org.apache.catalina.startup.VersionLoggerListener"/>

<!-- 用于服务器启动加载和服务器停止销毁APR,如果找不到APR库则会输出日志,并不会影响Tomcat启动 -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on"/>

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

<!-- 用于服务器启动加载服务器停止销毁全局资源服务 -->
<Listener className="org.apache.catalina.GlobalResouresLifecycleListener"/>

<!-- 用于在Context停止时重建Executor中的线程,以避免ThreadLocal中的内存泄漏 -->
<Listener className="org.apache.catalina.ThreadLocalLeakPreventionListener"/>
  • GlobalNamingResources中定义了全局命名服务:
<!-- 全局JNDI资源-->
<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

  • Service是用于创建Service实例的元素,默认使用org.apache.catalina.core.StandardService实现
  • 默认情况下 ,Tomcat只是指定了Service的名称,值为 "Catalina"
  • Service中的内嵌元素包括Listener, Executor, Connector, Engine
    • Listener: 添加Service生命周期的监听器
    • Executor: 配置Service的共享线程池
    • Connector: 配置Service包含的连接器
    • Engine: 配置Service中连接器对应的Servlet容器引擎
<Service name="Catalina">
	...
</Service>
  • 一个Server服务器可以包含多个Service服务

Executor

  • 默认情况下 ,Tomcat没有添加共享线程池的配置,这时Catalina各组件在用到线程池时会独自创建
  • 可以使用如下配置,在Service中添加一个线程池配置:
<Executor name="tomcatThreadPool"
	namePrefix="catalina-exec-"
	maxThreads="150"
	maxSpareThreads="4"
	maxIdleTime="60000"
	maxQueueSize="Integer.MAX_VALUE"
	prestartminSpareThreads="false"
	threadPriority="5"
	className="org.apache.catalina.core.StandardThreadExecutor"
/>
属性 描述
name 线程池名称,用于在Connector指定连接的线程池
namePrefix 创建的线程池中的线程的前缀: namePrefix + threadNumber
maxThreads 线程池中最大的线程数
minSpareThreads 活跃的核心线程数. 这些线程不会被销毁,会一直存在
maxIdleTime 线程空闲时间,超时后,空闲的线程会被销毁,默认空闲时间为60000(1分钟)
maxQueueSize 执行前最大的线程排队数,默认为Int的最大值,即广义的无限大
一般情况下,这个值不需要更改,否则会有请求不被处理的情况发生
prestartminSpareThreads 启动线程池时是否预启动minSpareThreads活跃线程,默认为false,不启动
threadPriority 线程池中的线程优先级,值为1-10,默认值为5
className 线程池的实现类
默认实现类为org.apache.catalina.core.StandardThreadExecutor
如果需要自定义线程池实现,首先需要实现org.apache.catalina.Executor接口

Connector

  • Connector用于创建连接器实例
  • 默认情况下 ,server.xml配置了一个支持HTTP协议的连接器
  • 可以根据需要配置一个支持AJP协议的连接器
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
  • port: 连接器的端口号
    • 用于Connector创建服务端Socket并进行监听,以等待客户端请求连接
    • 如果端口号设置为0. Tomcat 会随机选择一个可用的端口号给Connector使用
  • protocol: 连接器的访问协议
    • 默认为HTTP/1.1
    • 采用自动切换机制选择一个基于Java NIO的连接器或者基于APR的连接器,根据Tomcat本地是否含有APR库来决定
      • 如果需要明确指定协议的机制,不需要自动切换机制,可以通过自定义以下实现类:
        • HTTP协议:
          • 非阻塞的Java NIO连接器 : org.apache.coyote.http11.Http11NioProtocol
          • 非阻塞的Java NIO2连接器 : org.apache.coyote.http11.Http11Nio2Protocol
          • APR连接器 : org.apache.coyote.http11.Http11AprProtocol
        • AJP协议:
          • 非阻塞的Java NIO连接器 : org.apache.coyote.ajp.AjpNioProtocol
          • 非阻塞的Java NIO2连接器 : org.apache.coyote.ajp.AjpNio2Protocol
          • APR连接器 : org.apache.coyote.ajp.AjpAprProtocol
  • connectionTimeOut: Connector接收请求连接的等待超时时间,单位为毫秒, -1表示不超时
  • redirectPort:
    • Connector不支持HTTPS协议的SSL证书
    • 当接收到一个请求,符合security-constraint约束,需要SSL传输时 ,Catalinta会自动将请求重定向到指定的端口
  • executor: 指定共享线程池的名称
    • 也可以通过maxThreads,minSpareThreads等属性配置内部线程池
  • URIEncoding: 指定编码URI的字符编码
    • Tomcat 8.x版本默认的编码是UTF-8
    • Tomcat 7.x版本默认的编码是ISO8859-1
<Connector port="8080"
	protocol="HTTP/1.1"
	executor="tomcatThreadPool"
	maxThreads="150"
	minSpareThreads="4"
	acceptCount="150"
	maxConnections="150"
	connectionTimeout="20000"
	compression="on"
	compressionMinSize="1024"
	disableUploadTime="true"
	redirectPort="8048"
	URIEncoding="UTF-8"
/>

Engine

  • Engine作为Servlet引擎的顶级元素,内部可以嵌入:
    • Cluster
    • Listener
    • Realm
    • Valve
    • Host
<Engine name="Catalina" defaultHost="localhost">
	...
</Engine>
  • name: 用于指定Engine的名称,默认为Catalina. 该名称会影响一部分Tomcat文件,比如临时文件的存储路径
  • defaultHost: 默认使用的虚拟主机名称. 当客户端请求指向的主机无效时,将交由默认的虚拟主机处理,默认使用的虚拟主机名称默认为localHost
Host
  • Host用于配置一个虚拟主机,内部可以嵌入:
    • Alias
    • Cluster
    • Listener
    • Valve
    • Realm
    • Context
  • 如果在Engine中配置了Realm, 那么该Realm配置将在当前Engine下的所有Host中共享
  • 如果在Host中配置了Realm, 则在当前Host下的所有Context中共享
  • Context中的Realm的优先级 > HostRealm的优先级 > EngineRealm的优先级
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
	...
</Host>
  • name: 当前Host通用的网络名称,必须与DNS服务器上的注册信息一致. Engine中的Host必须存在一个名称与Engine中设置的defaultHost值一致的Host
  • appBase: 当前Host的应用基础目录. 当前Host下部署的Web应用均在该目录下 ,appBase的值可以是绝对路径,也可以是相对路径.默认为相对路径webapps
  • unpackWARs: 配置为true,Host启动时会将appBase目录下的war包解压为目录. 配置为false,Host将直接从war包启动
  • autoDeploy: 配置Tomcat是否的运行时定时检测并自动部署新增或变更的Web应用
  • 通过给Host添加别名,可以实现同一个Host拥有多个网络名称:
<Host name="www.tomcat.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
	<Alias>www.tomcats.com</Alias>
</Host>
  • 只要确保hosts文件或者DNS中添加了域名的映射配置,就可以访问当前Host配置的基础目录下的应用
Context
  • Context用于配置一个Web应用,内部可以嵌入:
    • CookieProcessor
    • Loader
    • Manager
    • Realm
    • Resources
    • WatchedResources
    • JarScanner
    • Valve
<Context docBase="app" path="/app">
	...
</Context>
  • docBase: Web应用目录或者是war包部署目录. 可以是绝对路径,也可以是相对于Host appBase的相对路径
  • path: Web应用的Context路径. 如果Host名称为localhost, 则对应的Web应用的Context访问路径为http://localhost:8080/app
tomcat-users.xml
  • 在该配置文件中,主要配置Tomcat的用户和角色等信息,用来控制Tomcatmanager,host-manager的访问权限