《Tomcat 架构深度拆解:从核心组件到请求处理流程》
tomcat核心组件的总结
一、环境说明
我用的环境是 Ubuntu 26.04 LTS,IP 地址 10.0.0.13,网关 10.0.0.2。Ubuntu 26.04 LTS 代号 Resolute Raccoon,搭载 Linux 7.0 内核,提供五年安全更新支持至 2031 年 4 月。这套环境比较新,用来学习和实践 Tomcat 是个不错的选择。
二、Tomcat 核心组件总览
Tomcat 作为 Apache 开源的轻量级 Java Servlet 容器,其核心组件主要由 Catalina、Coyote 和 Jasper 三大子系统构成,实现功能解耦:
-
Catalina — Tomcat 的 Servlet 容器核心,负责加载和管理 Servlet
-
Coyote — Tomcat 的 HTTP 连接器,负责处理网络通信
-
Jasper — JSP 引擎,负责将 JSP 页面编译为 Servlet
Tomcat 采用模块化分层设计,从顶层到底层包含以下核心组件:

Tomcat 之所以要设计这么多组件,归根结底是要实现两大核心功能:
-
处理 Socket 连接,负责网络字节流与 Request、Response 请求的封装与拆解
-
加载和管理 Servlet,处理具体的 Request 请求
三、Catalina(Servlet 容器)
Catalina 才是 Tomcat 真正的核心,其他模块都是在为它提供支撑。
Servlet 本身不包含 main 方法,因此需要依托容器来执行。Tomcat(Catalina)就是这样一个 Servlet 容器的具体实现。
Catalina 中的 Container 容器采用了分层结构:

这种父子关系的容器设计使得 Tomcat 可以灵活管理多个虚拟主机和多个 Web 应用。
每个容器组件都实现了 Lifecycle 接口,通过状态机来控制初始化、启动、停止和销毁,启动顺序为:Engine → Host → Context → Wrapper。
四、Coyote(连接器)
Coyote 是 Tomcat 的 HTTP 连接器实现,负责处理底层的网络通信。
Coyote 连接器内部又细分为三个子组件,这种拆分体现了高内聚、低耦合的设计思想:

Endpoint 和 Processor 被组装在一起形成 ProtocolHandler 组件,支持不同的 IO 模型和协议组合。
Tomcat 支持多种 IO 模型:
从 Tomcat 8.5 开始也支持 HTTP/2 协议,提供多路复用和头部压缩能力。
五、Jasper(JSP 引擎)
Jasper 是 Tomcat 的 JSP 核心引擎。JSP 本质上是一个 Servlet,Jasper 负责对 JSP 语法进行解析,生成对应的 Java 文件并编译为 class 字节码。
Jasper 采用运行时编译策略——Tomcat 不会在启动时自动编译所有 JSP 文件,而是在客户端第一次请求时才编译需要访问的 JSP:
// JSP 示例
<%@ page import="java.util.Date" %>
<html>
<head><title>JSP 示例</title></head>
<body>
<% Date date = new Date(); %>
当前时间: <%= date %>
</body>
</html>
编译后的 class 文件默认存放在 work/Catalina/localhost/ 对应 Context 目录下,下次访问可直接使用,避免了重复编译,这也是 Tomcat 性能较高的原因之一。
六、生命周期管理与配置组件
Tomcat 通过 conf/server.xml 配置文件定义各个组件的层次关系:
<Server>
<Service>
<Connector port="8080" protocol="HTTP/1.1"/>
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps">
<Context path="/myapp" docBase="myapp"/>
</Host>
</Engine>
</Service>
</Server>
此外还有几个重要的配置组件:
Realm:安全域,相当于用户认证的“数据库”,存储用户名、密码以及关联的角色信息
JNDI 资源:通过 Context 配置数据源等资源
Session 管理:支持多种 Session Manager 实现,包括 StandardManager、PersistentManager 等
七、Pipeline-Valve 责任链模式
Container 处理请求时使用的 Pipeline-Valve 机制是 Tomcat 架构的一个亮点:
Pipeline 就像一条管道,Valve 就是管道上的阀门,采用的是责任链模式,即在一个请求处理过程中有多个处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完后再交给下一个处理者继续处理。
Pipeline-Valve 的两点重要特性:
-
每个 Pipeline 都有一个不可删除的 BaseValve,位于管道末端
-
上层容器的 BaseValve 会调用下层容器的 Pipeline
四个容器对应的 BaseValve 分别为:
StandardEngineValve(Engine 层)
StandardHostValve(Host 层)
StandardContextValve(Context 层)
StandardWrapperValve(Wrapper 层)
八、请求处理完整流程
综合以上组件,一条 HTTP 请求在 Tomcat 中的完整路径如下:
客户端 HTTP 请求
↓
【Coyote 连接器层】
├── Endpoint:监听 8080 端口,获取 Socket 连接
├── Processor:解析 HTTP 协议,生成 Tomcat Request 对象
└── Adapter:适配为 ServletRequest,传递给 Container
↓
【Container 容器层 - Pipeline-Valve 责任链处理】
├── Engine 管道:接收请求,匹配 Host
├── Host 管道:匹配虚拟主机,找到对应 Context
├── Context 管道:匹配 Web 应用,找到对应 Wrapper
└── Wrapper 管道:创建 FilterChain,依次调用 Filter 和 Servlet 的 service() 方法
↓
Servlet 执行并生成 Response(业务逻辑处理)
↓
Response 按原路返回:Context → Host → Engine → Connector
↓
【Coyote】将 Response 序列化为 HTTP 响应字节流,通过 Socket 返回给客户端
↓
客户端接收响应
整个请求处理的精髓可概括为:
Connector 负责接收请求、解析协议,Container 通过 Pipeline-Valve 责任链逐级向下匹配 Engine → Host → Context → Wrapper,最终定位到对应的 Servlet 执行业务逻辑,响应再原路返回。
每个组件各司其职但又紧密协作,共同构建了 Tomcat 这个精妙的高性能 Web 服务器。
tomcat的环境准备和安装
一、安装前准备工作
1.1 环境信息确认
本次安装的服务器环境如下:

在开始安装之前,首先登录服务器并进行系统更新,确保所有软件包处于最新状态:
apt update
apt upgrade -y
更新系统软件包列表和已安装包,可以确保后续安装的依赖项兼容性,避免因版本过旧导致的冲突问题。
1.2 验证 Java 是否已安装
Tomcat 是基于 Java 的 Web 应用程序,因此必须先安装 JDK。首先检查 Java 是否已存在:
java -version
如果 Java 尚未安装,系统会显示 Command 'java' not found。
二、安装 Java 开发环境(JDK)
2.1 选择 JDK 版本
Tomcat 各个版本对 JDK 版本有明确要求。根据官方兼容性说明:
-
Tomcat 11.x 需要 JDK 17 或更高版本
-
Tomcat 10.1.x 需要 JDK 11 或更高版本
-
Tomcat 9.x 需要 JDK 8 或更高版本
Ubuntu 26.04 的官方软件源中包含了 OpenJDK 21,考虑到长期稳定性和安全更新,本次选择安装 OpenJDK 21(实际安装过程中你也可以选择 OpenJDK 17 或 21,Ubuntu 26.04 对两者均有良好支持)。
2.2 安装 OpenJDK
执行以下命令安装 OpenJDK 17(也可选择 21,命令类似):
apt install openjdk-17-jdk -y
如果需要安装 OpenJDK 21,则使用:
apt install openjdk-21-jdk -y
2.3 验证安装
安装完成后,验证 JDK 是否安装成功:
java -version
javac -version

javac 命令的输出也会显示对应的 Java 编译器版本信息。
2.4 配置 JAVA_HOME 环境变量
为了让系统能够准确找到 Java 的安装位置,需要配置 JAVA_HOME 环境变量。首先找到 JDK 的实际安装路径:
update-alternatives --config java
根据命令输出的信息,找到 Java 安装路径(例如 /usr/lib/jvm/java-17-openjdk-amd64)。然后编辑 /etc/environment 或 ~/.bashrc:
nano /etc/environment
在文件末尾添加以下内容(路径根据实际安装位置填写):
JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"
使配置生效:
source /etc/environment
验证 JAVA_HOME 是否正确配置:
echo $JAVA_HOME

三、创建专用于运行 Tomcat 的用户
3.1 为什么需要专用用户?
安全考虑:使用 root 用户运行 Tomcat 会增加潜在的安全风险。如果 Tomcat 被攻击,攻击者可能获得整个服务器的控制权。因此,创建一个权限受限的专用系统用户来运行 Tomcat 是最佳实践。
3.2 创建用户和目录
首先创建 Tomcat 的安装目录:
mkdir -p /opt/tomcat
然后创建名为 tomcat 的用户和用户组:
groupadd tomcat
useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat
命令参数说明:

四、下载并安装 Tomcat
4.1 选择 Tomcat 版本
Tomcat 官网提供了多个版本系列可供选择:

生产环境建议下载 官方二进制包(Binary Distributions) ,这样可以自由选择版本,也便于后续升级和维护。
4.2 下载 Tomcat 安装包
切换到临时目录,使用 wget 命令下载:
cd /tmp
wget https://dlcdn.apache.org/tomcat/tomcat-11/v11.0.22/bin/apache-tomcat-11.0.22.tar.gz
4.3 解压并移动到目标目录
tar -xzvf apache-tomcat-11.0.22.tar.gz -C /opt/tomcat --strip-components=1
命令参数说明:
-xzvf:解压并显示处理信息
-C /opt/tomcat:指定解压目标目录
--strip-components=1:去除顶层目录,直接将内容放入 /opt/tomcat
4.4 设置权限
将 Tomcat 目录的所有权赋予之前创建的 tomcat 用户:
chown -R tomcat:tomcat /opt/tomcat
设置脚本的可执行权限:
chmod +x /opt/tomcat/bin/*.sh
4.5 配置环境变量
为了方便管理,配置 CATALINA_HOME 环境变量:
echo 'export CATALINA_HOME=/opt/tomcat' >> ~/.bashrc
echo 'export PATH=$CATALINA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
五、配置 Tomcat 作为系统服务(systemd)
5.1 为什么要配置为系统服务?
配置为 systemd 服务后可以实现:
统一管理:使用 systemctl start/stop/restart 命令控制 Tomcat
开机自启:服务器重启后 Tomcat 自动运行
日志集成:Tomcat 日志与系统日志统一管理
5.2 创建 systemd 服务文件
vim /etc/systemd/system/tomcat.service
在文件中添加以下内容:
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_BASE=/opt/tomcat"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
配置项说明:

特别提醒:JAVA_HOME 的路径务必填写之前配置的实际 JDK 路径,否则 Tomcat 将无法启动。
5.3 加载服务并设置开机自启
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 设置开机自启
sudo systemctl enable tomcat
# 启动 Tomcat 服务
sudo systemctl start tomcat
# 查看服务状态
sudo systemctl status tomcat

六、配置防火墙
6.1 开放 8080 端口
Tomcat 默认监听 8080 端口,需要开放此端口以便外部访问:
ufw allow 8080/tcp
ufw enable
ufw status
七、验证 Tomcat 安装
7.1 本地验证
在服务器本机上执行 curl 命令验证:
curl http://localhost:8080
7.2 远程访问
在浏览器中输入以下地址访问 Tomcat 欢迎页面:
http://10.0.0.13:8080
八、Tomcat 服务管理常用命令

总结tomcat配置文件和目录的作用
一、Tomcat 核心目录结构
Tomcat 安装目录(以 /usr/local/tomcat9 为例)下,各目录的核心作用如下:

二、Tomcat 核心配置文件详解
所有配置文件都在 conf 目录下,其中最关键的有 4 个:
1. server.xml —— 全局核心配置文件
Tomcat 最顶层的配置文件,定义了整个服务的架构、端口、连接器、引擎、虚拟主机,相当于 Tomcat 的 “架构蓝图”。
- 核心配置项:
<Server>:Tomcat 根节点,控制服务生命周期。<Service>:绑定连接器和引擎,定义服务实例。<Connector>:配置端口(如 8080)、协议(HTTP/AJP)、连接数、超时时间。<Engine>:请求调度器,管理虚拟主机。<Host>:虚拟主机配置,绑定域名和应用路径。
2. web.xml —— 全局 Web 应用默认配置
定义所有 Web 应用的通用规则,相当于所有项目的 “公共模板”。
- 核心配置项:
- Servlet 默认映射(如
/路径的默认 Servlet)。 - MIME 类型(文件扩展名与响应类型的映射,如
.html对应text/html)。 - 会话超时时间(默认 30 分钟)。
- 安全约束、错误页面配置。
- Servlet 默认映射(如
3. context.xml —— 应用上下文全局配置
所有 Web 应用共享的上下文配置,控制应用的数据源、资源、会话、加载器等。
- 核心配置项:
- 数据库连接池(JNDI 数据源)配置。
- 资源引用、环境变量配置。
- 会话持久化、应用重载策略。
4. tomcat-users.xml —— 用户与权限配置
Tomcat 管理控制台(Manager、Host-Manager)的用户认证文件,配置账号、密码和角色权限。
- 核心配置项:
<user>:定义管理员账号、密码和角色(如manager-gui、admin-gui)。<role>:定义角色权限,控制不同用户能访问的管理功能。
三、补充:Web 应用内部配置文件
每个部署在 webapps 下的项目,WEB-INF 目录下也有专属配置:
WEB-INF/web.xml:项目级配置,会覆盖全局web.xml的规则,定义项目专属的 Servlet、过滤器、监听器。WEB-INF/context.xml:项目级上下文配置,优先级高于全局context.xml。
四、配置文件与目录的关联逻辑
- 启动 Tomcat 时,
bin/startup.sh读取conf/server.xml初始化服务架构; - 加载
conf/web.xml、conf/context.xml作为全局默认配置; - 扫描
webapps目录下的应用,加载每个项目的WEB-INF/web.xml和WEB-INF/context.xml; - 运行过程中,日志写入
logs目录,JSP 编译文件写入work目录,临时文件写入temp目录。
tomcat部署halo项目相关的过程总结
一、项目与环境说明
1. 项目介绍
Halo 是一款轻量级、可扩展的现代化 Java 开源博客系统,支持主题自定义、插件扩展,是个人博客搭建的热门选择。本次课程演示将 Halo 项目部署在 Tomcat 服务器上,实现可公网访问的博客站点。
2. 部署环境
- 操作系统:Ubuntu 20.04 LTS
- 服务器 IP:
10.0.0.13 - 网关:
10.0.0.2 - 依赖环境:JDK 1.8、Tomcat 9
- 防火墙:UFW(已放行 22/8080 端口)
二、前置准备:环境检查与确认
1. 检查 JDK 环境
java -version
2. 检查 Tomcat 服务状态
# 查看 Tomcat 进程
ps -ef | grep tomcat
# 查看 8080 端口监听状态
ss -tulnp | grep 8080
三、步骤 1:下载 Halo 项目 WAR 包
1. 进入临时目录下载文件
cd /tmp
# 下载稳定版 Halo WAR 包(以 1.5.6 为例,可根据需要替换版本)
wget https://github.com/halo-dev/halo/releases/download/v1.5.6/halo-1.5.6.war
四、步骤 2:部署 Halo 到 Tomcat
1. 移动 WAR 包到 Tomcat 部署目录
Tomcat 会自动部署 webapps 目录下的 WAR 包
# 将 WAR 包重命名为 ROOT.war,直接部署为根路径(访问时无需加项目名)
mv /tmp/halo-1.5.6.war /usr/local/tomcat9/webapps/ROOT.war
2. 重启 Tomcat 触发自动部署
# 先停止 Tomcat
/usr/local/tomcat9/bin/shutdown.sh
# 等待 3-5 秒,再启动 Tomcat
/usr/local/tomcat9/bin/startup.sh
3. 检查部署日志
查看 Tomcat 日志确认 Halo 部署状态:
tail -f /usr/local/tomcat9/logs/catalina.out
五、步骤 3:防火墙与网络配置确认
1. 检查 UFW 规则
ufw status
2. 本地测试访问
在服务器上通过 curl 命令测试
curl http://localhost:8080
3. 客户端访问测试
在本地电脑浏览器中输入:
http://10.0.0.13:8080
首次访问会自动跳转到 Halo 初始化页面,出现安装引导界面即部署成功。
六、常见问题排查
1. 客户端无法访问 8080 端口
- 检查服务器
ufw status,确认 8080 端口已放行 - 检查服务器 IP 与客户端是否在同一网段,
ping 10.0.0.13测试连通性 - 检查 Tomcat 进程是否正常,
ps -ef | grep tomcat确认进程存在
2. Tomcat 启动后无 Halo 页面
- 检查
webapps目录下是否生成ROOT文件夹:ls /usr/local/tomcat9/webapps/ - 查看
logs/catalina.out日志,排查是否有部署报错(如 JDK 版本不兼容、文件权限不足)
3. 初始化页面无法加载
- 检查服务器网络是否正常,
curl https://github.com测试外网连通性 - 重启 Tomcat 服务:
shutdown.sh && startup.sh
更多推荐



所有评论(0)