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.1、AJP/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:主机名(如localhost或www.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 -->
/>