Tomcat 深度解析:架构、组件与目录结构详解
Tomcat 是 Apache 基金会开发的开源 Servlet 容器,用于运行 Java Web 应用(如 Servlet、JSP),是 Java EE 生态中最常用的应用服务器之一。本文从核心功能、目录结构、组件架构三个维度,全面解析 Tomcat 的工作原理,帮助理解其设计思想与使用方式。
Tomcat 的核心功能
Tomcat 作为 Servlet 容器,核心任务是管理 Servlet 的生命周期并处理 HTTP 请求,具体包括:
- Servlet 生命周期管理:
- 首次请求某 Servlet 时,加载该 Servlet 类并调用
init()方法(仅执行一次,用于初始化资源); - 每次请求时,创建
ServletRequest(封装请求数据)和ServletResponse(封装响应数据); - 调用 Servlet 的
service()方法处理请求,最终通过ServletResponse返回结果; - 服务器关闭时,调用
destroy()方法释放资源。
- 首次请求某 Servlet 时,加载该 Servlet 类并调用
- HTTP 请求处理:
通过连接器(Connector)接收客户端 HTTP 请求,转发给容器(Container)处理,最终将响应返回给客户端。
Tomcat 目录结构详解
Tomcat 的安装目录结构清晰,各目录分工明确,以下是核心目录的功能说明:
| 目录 | 作用 |
|---|---|
bin/ |
存放启动 / 关闭脚本(如startup.sh/shutdown.sh,Windows 为.bat);包含catalina.sh(核心运行脚本)。 |
conf/ |
配置文件目录,包含 Tomcat 的核心配置(重点目录)。 |
lib/ |
Tomcat 运行依赖的 JAR 包(如 Servlet API、Catalina 核心类),所有 Web 应用共享。 |
logs/ |
日志文件目录(如catalina.out记录系统日志,localhost_access_log.*记录访问日志)。 |
temp/ |
临时文件目录(Tomcat 运行时自动生成,可安全删除)。 |
webapps/ |
默认 Web 应用部署目录(放入 WAR 包或应用文件夹即可自动部署)。 |
work/ |
JSP 编译目录(JSP 文件会被编译为 Servlet 类存于此,删除后重启 Tomcat 会重新编译)。 |
conf/目录核心文件详解
conf/是 Tomcat 配置的核心,包含以下关键文件:
server.xml:
Tomcat 最核心的配置文件,定义服务器的整体架构(如端口、连接器、虚拟主机)。- 配置监听端口(默认 8080)、HTTPS 端口(默认 8443);
- 定义虚拟主机(
Host)、应用部署路径等。
web.xml:
所有 Web 应用的默认部署描述符,定义基础 Servlet(如DefaultServlet处理静态资源)和 MIME 类型映射。- 若 Web 应用自身不含
web.xml,Tomcat 会使用此文件初始化配置; - 应用的
web.xml会与该文件合并(应用配置优先级更高)。
- 若 Web 应用自身不含
context.xml:
全局上下文配置,所有 Web 应用共享的上下文参数(如数据源、会话配置)。tomcat-users.xml:
定义 Tomcat 管理界面(如 Manager App)的用户及角色(需配置role和user标签)。Catalina/:
虚拟主机配置目录,其中localhost/存放特定应用的Context配置文件(如myapp.xml定义/myapp应用的路径)。
Tomcat 组件架构:从 Server 到 Wrapper
Tomcat 的架构采用分层设计,核心组件按层级划分,形成 “Server → Service → Connector/Container → …” 的结构,如下图所示:

核心组件说明
Server(服务器):
- 整个 Tomcat 的顶层组件,代表一个完整的服务器实例(一个 Tomcat 中只有一个 Server);
- 负责管理所有
Service组件的生命周期(初始化、启动、关闭); - 在
server.xml中由<Server>标签定义,默认端口 8005(用于接收关闭命令)。
Service(服务):
- 关联
Connector(连接器)和Container(容器),一个Service包含多个Connector和一个Container; - 作用:将接收请求的
Connector与处理请求的Container绑定,实现 “接收 - 处理” 链路; - 在
server.xml中由<Service>标签定义,默认名称为Catalina。
- 关联
Connector(连接器):
负责监听网络端口(如 8080),接收客户端 HTTP/HTTPS 请求,解析请求数据并转发给
Container;支持多种协议(HTTP、HTTPS、AJP)和 I/O 模型(NIO、NIO2、APR);
示例配置(server.xml):
1
2
3
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
Container(容器):
- 负责处理
Connector转发的请求,是 Servlet 的运行环境; - 按层级分为 4 个子容器(接口),从顶层到底层依次为:
- Engine:整个 Servlet 引擎,管理多个虚拟主机(
Host),是最顶层容器; - Host:代表一个虚拟主机(如
localhost),对应一个域名,管理多个 Web 应用(Context); - Context:代表一个 Web 应用(如
/myapp),管理多个 Servlet(Wrapper); - Wrapper:代表一个 Servlet 实例,是最底层容器,直接封装 Servlet。
- Engine:整个 Servlet 引擎,管理多个虚拟主机(
- 容器层级关系:
Engine → Host → Context → Wrapper(上层包含下层,形成树形结构)。
- 负责处理
Executor(线程池):
共享线程池,用于
Connector处理请求,避免频繁创建线程的开销;配置示例:
1
2<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
Pipeline(管道)与 Valve(阀门):
- 管道是容器处理请求的链式结构,每个容器(如 Engine、Host)都有一个
Pipeline; - 阀门是管道中的处理单元(如日志记录、权限校验),请求会依次经过所有阀门处理;
- 示例:
AccessLogValve用于记录访问日志,配置在Host中。
- 管道是容器处理请求的链式结构,每个容器(如 Engine、Host)都有一个
Naming(JNDI 服务):
- Java 命名与目录接口(JNDI),用于应用查找资源(如数据源、配置参数);
- 开发时通过 JNDI 名称访问资源,部署时在
context.xml中配置实际资源,实现 “开发与部署分离”。
组件协作流程:一个 HTTP 请求的处理过程
- 客户端发送 HTTP 请求到 Tomcat 的
Connector(如 8080 端口); Connector解析请求,封装为ServletRequest和ServletResponse;Connector将请求转发给Service关联的Container(Engine);Engine根据请求的域名匹配对应的Host(虚拟主机);Host根据请求路径(如/myapp)匹配对应的Context(Web 应用);Context根据路径匹配对应的Wrapper(Servlet);Wrapper调用 Servlet 的service()方法处理请求;- 处理结果通过
ServletResponse返回,经Connector发送给客户端。