tomcat之server配置文件

Tomcat server.xml 配置文件详解

server.xml 是 Tomcat 最核心的配置文件,定义了服务器的整体结构、组件关系及运行参数。本文将逐节点解析其配置细节,帮助理解 Tomcat 的工作机制及优化配置。

配置文件整体结构

Tomcat 的 server.xml 采用 XML 格式,核心节点层级关系如下:

<Server>                 <!-- 整个 Tomcat 服务器 -->
  <Listener />           <!-- 生命周期监听器 -->
  <GlobalNamingResources /> <!-- 全局命名资源 -->
  <Service>              <!-- 服务(连接器 + 引擎) -->
    <Executor />         <!-- 共享线程池 -->
    <Connector />        <!-- 连接器(接收请求) -->
    <Engine>             <!-- 引擎(处理请求) -->
      <Host>             <!-- 虚拟主机 -->
        <Context />      <!-- Web 应用上下文 -->
      </Host>
    </Engine>
  </Service>
</Server>

每个节点代表 Tomcat 的一个核心组件,负责特定功能。

核心节点解析

<Server>:整个 Tomcat 实例的根节点

<Server> 是配置文件的根元素,代表整个 Tomcat 服务器,负责启动和管理所有组件。

主要属性
  • port:服务器监听的关闭端口(默认 8005),用于接收关闭命令。

  • shutdown:关闭服务器的指令字符串(默认 SHUTDOWN)。

    示例:通过 telnet 发送关闭命令:

    telnet 127.0.0.1 8005
    > SHUTDOWN  # 输入后 Tomcat 会关闭
子节点
  • <Listener>:生命周期监听器,用于监控服务器启动、停止等事件(如 VersionLoggerListener 记录版本信息)。
  • <GlobalNamingResources>:全局 JNDI 资源配置(如数据源),供所有应用共享。
  • <Service>:一个或多个服务组件,每个服务包含连接器和引擎。

<Service>:连接器与引擎的组合

<Service> 将多个连接器(Connector)与一个引擎(Engine)绑定,形成一个独立的服务单元。

属性
  • name:服务名称(默认 Catalina),用于标识服务。
子节点
  • <Executor>:配置共享线程池,供多个连接器复用(优化性能)。
  • <Connector>:连接器,负责接收客户端请求。
  • <Engine>:引擎,负责处理连接器接收的请求。

<Executor>:共享线程池(性能优化关键)

<Executor> 定义全局线程池,多个连接器可共享该线程池,避免重复创建线程,提升性能。默认不配置,需手动添加。

配置示例
<Executor 
  name="tomcatThreadPool"    <!-- 线程池名称唯一-->
  namePrefix="catalina-exec-" <!-- 线程名称前缀 -->
  maxThreads="150"           <!-- 最大线程数(默认 200) -->
  minSpareThreads="4"        <!-- 最小空闲线程数(默认 25) -->
  maxIdleTime="60000"        <!-- 空闲线程超时时间(毫秒,默认 60000) -->
  maxQueueSize="1000"        <!-- 任务队列最大长度(默认 Integer.MAX_VALUE) -->
/>
使用方式

<Connector> 中通过 executor 属性引用:

<Connector 
  executor="tomcatThreadPool"  <!-- 关联线程池 -->
  port="8080" 
  protocol="HTTP/1.1"
/>

<Connector>:请求接收与协议处理

<Connector> 是 Tomcat 与客户端通信的接口,负责监听端口、接收请求并转换协议。默认配置 HTTP 和 AJP 两种连接器。

主要属性分类
类别 核心属性
基础配置 port(端口)、protocol(协议,如 HTTP/1.1AJP/1.3)、connectionTimeout(连接超时,默认 20000 毫秒)。
性能优化 maxThreads(最大处理线程数)、acceptCount(请求排队数)、maxConnections(最大并发连接数)。
编码与安全 URIEncoding(URI 编码,默认 ISO-8859-1,建议设为 UTF-8)、redirectPort(HTTPS 重定向端口,默认 8443)。
压缩配置 compression="on"(启用 GZIP 压缩)、compressionMinSize(压缩阈值,默认 2048 字节)、compressableMimeType(压缩的 MIME 类型)。
配置示例(HTTP 连接器)
<Connector 
  port="8080" 
  protocol="HTTP/1.1"
  connectionTimeout="20000"
  redirectPort="8443"
  URIEncoding="UTF-8"          <!-- 解决中文乱码 -->
  maxThreads="500"             <!-- 支持 500 并发线程 -->
  acceptCount="200"            <!-- 队列最多 200 个请求 -->
  compression="on"             <!-- 启用压缩 -->
  compressionMinSize="1024"    <!-- 大于 1KB 才压缩 -->
/>

<Engine>:请求处理的核心引擎

<Engine> 是服务的请求处理核心,负责将请求路由到对应的虚拟主机(Host)。一个 <Service> 只能有一个 <Engine>

主要属性
  • name:引擎名称(默认 Catalina)。
  • defaultHost:默认虚拟主机(默认 localhost),当请求的主机不存在时使用。
  • jvmRoute:负载均衡场景下的实例标识,用于粘性会话(如 tomcat1)。
子节点
  • <Host>:虚拟主机,引擎通过主机名匹配请求。
  • <Realm>:全局安全认证配置(如用户名密码验证)。

<Host>:虚拟主机配置

<Host> 代表一个虚拟主机(网站),负责管理多个 Web 应用(Context)。

主要属性
  • name:主机名(如 localhostwww.example.com),需与 DNS 配置一致。
  • appBase:应用基础目录(默认 webapps),存放 WAR 包或目录形式的 Web 应用。
  • unpackWARs:是否自动解压 WAR 包(默认 true,建议生产环境设为 false 节省空间)。
  • autoDeploy:是否自动部署新应用(默认 true,定期扫描 appBase 目录)。
配置示例
<Host 
  name="www.example.com"    <!-- 自定义域名 -->
  appBase="/var/webapps"    <!-- 应用存放路径 -->
  unpackWARs="false"        <!-- 不解压 WAR 包 -->
  autoDeploy="true">
  <Alias>example.com</Alias> <!-- 域名别名 -->
</Host>

<Context>:Web 应用上下文

<Context> 配置单个 Web 应用,定义应用的访问路径、部署位置等。

主要属性
  • path:应用访问路径(如 /myapp,根路径用 "")。
  • docBase:应用实际路径(可是目录或 WAR 包,如 webapps/myapp/opt/apps/myapp.war)。
  • reloadable:是否自动重载(默认 false,开发环境可设为 true,监控 WEB-INF 目录变更)。
配置示例
<!-- 将 /opt/myapp 目录映射到 /test 路径 -->
<Context 
  path="/test" 
  docBase="/opt/myapp" 
  reloadable="true"  <!-- 开发模式自动重载 -->
/>
子节点(常用)
  • <Manager>:会话管理器配置(如持久化到文件或数据库)。
  • <Loader>:类加载器配置(控制类加载顺序)。
  • <CookieProcessor>:Cookie 解析器(默认 Rfc6265CookieProcessor,兼容最新标准)。

实用配置场景

1. 多虚拟主机配置

通过多个 <Host> 实现多网站部署:

<Engine name="Catalina" defaultHost="localhost">
  <!-- 本地默认主机 -->
  <Host name="localhost" appBase="webapps" />
  
  <!-- 自定义网站 -->
  <Host name="www.app1.com" appBase="/var/app1">
    <Context path="" docBase="ROOT" /> <!-- 根路径应用 -->
  </Host>
  
  <Host name="www.app2.com" appBase="/var/app2" />
</Engine>

2. 会话持久化配置

将会话存储到文件(避免 Tomcat 重启丢失会话):

<Context path="/myapp">
  <Manager className="org.apache.catalina.session.PersistentManager">
    <Store className="org.apache.catalina.session.FileStore" directory="sessions" />
  </Manager>
</Context>

3. 解决中文乱码

在 HTTP 连接器中设置编码:

<Connector 
  port="8080" 
  protocol="HTTP/1.1"
  URIEncoding="UTF-8"          <!-- URI 编码 -->
  useBodyEncodingForURI="true" <!-- 表单提交编码复用 contentType -->
/>