Apache Tomcat 是一个开源的 Java Servlet 容器和 Web 服务器,实现了 Java EE(现 Jakarta EE)中的 Servlet、JSP、WebSocket 等规范。其架构采用分层组件模型,各组件协同工作以处理 HTTP 请求并返回响应。
以下是 Tomcat 的核心组件及其详细作用,按层次从外到内、从高到低说明:
| 组件 | 说明 |
|---|---|
| Server | 服务器,Tomcat 运行的进程实例,一个 Server 中可以有多个 Service,但通常就一个 |
| Service | 服务,用来组织 Engine 和 Connector 的对应关系,一个 Service 中只有一个 Engine |
| Connector | 连接器,负责客户端的 HTTP、HTTPS、AJP 等协议连接,一个 Connector 只属于某一个 Engine |
| Engine | 引擎,用来响应并处理用户请求。一个 Engine 上可以绑定多个 Connector |
| Host | 虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分 |
| Context | 应用的上下文,配置特定 URL 路径映射和目录的映射关系:url => directory |
Tomcat 运行逻辑
Tomcat 运行逻辑结构表
| 层级 | 组件 | 功能说明 |
|---|---|---|
| 根节点 | Server | Tomcat 的顶层容器,代表一个运行中的进程实例;一个 Server 可包含多个 Service,但通常只有一个。 |
| 第二层 | Service | 将 Connector 和 Engine 关联起来,实现请求接收与处理的绑定;一个 Service 包含一个 Engine 和多个 Connector。 |
| 第三层 | Connector | 连接器,负责接收客户端通过 HTTP、HTTPS、AJP 等协议发送的请求;每个 Connector 按协议独立运行,可配置不同端口或监听方式。 |
| Engine | 引擎,负责处理请求的核心组件;一个 Engine 可绑定多个 Connector(如 HTTP + HTTPS),并管理多个 Host。 | |
| 第四层 | Host | 虚拟主机,表示一个独立的 Web 站点,可通过域名区分;例如 www.example.com 和 blog.example.com 可配置为不同的 Host。 |
| 第五层 | Context | 应用上下文,对应一个 Web 应用(如 /app),用于配置 URL 到目录的映射(如 /app → /webapps/app);每个 Host 可包含多个 Context。 |
补充说明(基于图示)
-
按协议划分 Connector :
图中显示两个 Connector 分别接收不同协议(如 HTTP/HTTPS),它们属于同一个 Service 或不同 Service,实现多协议共存。
-
defaultHost :
当请求的域名未匹配任何 Host 时,会使用默认的
defaultHost进行处理,通常指向默认站点。 -
多 Engine 支持 :
若配置多个 Engine(即多个 Service),则可支持多个独立的 Web 运行环境,适合隔离不同业务场景。
1. Server(服务器)
- 作用:代表整个 Tomcat 实例,是 Tomcat 的顶级容器。
- 特点 :
- 一个 JVM 中只能有一个
Server。 - 负责启动和停止整个 Tomcat 服务。
- 包含一个或多个
Service组件。
- 一个 JVM 中只能有一个
- 配置文件位置 :
server.xml的根元素<Server>。
类比:整个 Tomcat 应用程序本身。
2. Service(服务)
-
作用 :将 Connector(连接器) 和 Container(容器) 绑定在一起,形成一个完整的服务单元。
-
组成 :
- 1 个 Container (即
Engine) - 1 个或多个 Connector
- 1 个 Container (即
-
特点 :
- 一个
Server可包含多个Service(但通常只用一个)。 - 每个
Service独立处理请求,互不影响。
- 一个
-
配置示例 :
<Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" /> <Engine name="Catalina" defaultHost="localhost"> ... </Engine> </Service>
类比:一个"服务组",把监听端口(Connector)和处理逻辑(Engine)打包。
3. Connector(连接器)
-
作用:负责接收客户端请求(如 HTTP、AJP),并将请求交给 Container 处理;同时将响应返回给客户端。
-
关键功能 :
- 监听指定端口(如 8080)
- 解析 HTTP 协议
- 支持多种协议:HTTP/1.1、HTTP/2、AJP(用于与 Apache/Nginx 集成)
- 支持 SSL/TLS(HTTPS)
- 管理线程池、连接超时、缓冲区等
-
常见类型 :
HTTP/1.1 Connector:处理标准 HTTP 请求AJP Connector:用于与反向代理(如 Apache HTTPD)通信
-
配置示例 :
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
✅ 类比:Tomcat 的"耳朵和嘴巴"------听请求,说响应。
4. Engine(引擎)
-
作用 :是 Container(容器) 的顶层,代表整个请求处理引擎。
-
职责 :
- 接收来自
Connector的请求 - 根据请求的 Host(域名) 将请求路由到对应的
Host组件 - 通常一个
Engine对应一个Service
- 接收来自
-
关键属性 :
name:引擎名称(需与Service中引用一致)defaultHost:当请求的 Host 未匹配任何<Host>时,使用默认 Host
-
配置示例 :
<Engine name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps" /> <Host name="example.com" appBase="webapps-example" /> </Engine>
类比:请求的"总调度中心",根据域名分发任务。
5. Host(虚拟主机)
-
作用 :代表一个 虚拟主机(Virtual Host) ,即一个域名(如
localhost、www.example.com)。 -
职责 :
- 接收来自
Engine的、目标为该域名的请求 - 根据 URL 路径(如
/myapp)将请求路由到对应的Context - 管理该主机下的所有 Web 应用(Context)
- 接收来自
-
关键属性 :
name:主机名(必须与 DNS 或 hosts 文件匹配)appBase:该主机下 Web 应用的根目录(如webapps)autoDeploy:是否自动部署新应用
-
配置示例 :
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> </Host>
类比:一栋"办公楼",每个租户(Web 应用)有自己的楼层(Context)。
6. Context(上下文 / Web 应用)
- 作用 :代表一个 具体的 Web 应用程序(即一个 WAR 包或目录)。
- 职责 :
- 加载该应用的
web.xml配置 - 管理 Servlet、Filter、Listener 的生命周期
- 提供应用级别的资源(如 JNDI、数据库连接池)
- 处理具体的 URL 路径(如
/myapp/someServlet)
- 加载该应用的
- 关键属性 :
path:访问路径(如/myapp),通常由 WAR 文件名或目录名自动推导docBase:应用的实际物理路径(可选)reloadable:开发时是否自动重载 class 文件
- 配置方式 :
-
自动部署:将 WAR 放入
appBase目录(如webapps/myapp.war→ 路径为/myapp) -
手动配置:在
conf/Catalina/localhost/myapp.xml中定义<Context docBase="/opt/myapps/myapp" reloadable="true" />
-
类比:办公楼里的"一个公司",有自己的员工(Servlet)和规则(web.xml)。
请求处理流程(完整链路)
- 客户端发送 HTTP 请求到
http://localhost:8080/myapp/hello - Connector 监听到 8080 端口,接收请求
- Engine 接收请求,根据
Host: localhost路由到对应Host - Host 根据路径
/myapp找到对应的Context - Context 根据
/hello匹配到Servlet(由Wrapper封装) - 调用
Servlet.service()方法处理请求 - 响应沿原路返回给客户端
补充:Wrapper(Servlet 包装器)
- 虽然不是
server.xml中的显式配置项,但它是 Tomcat 内部组件。 - 作用 :封装一个具体的 Servlet 实例,管理其生命周期(init/destroy)。
- 属于
Context的子组件。
组件层级关系总结
| 组件 | 对应配置元素 | 作用范围 | 数量关系 |
|---|---|---|---|
| Server | <Server> |
整个 Tomcat 实例 | 1 个 |
| Service | <Service> |
服务单元 | 1~N 个(通常 1 个) |
| Connector | <Connector> |
网络协议处理 | 1~N 个(HTTP + AJP) |
| Engine | <Engine> |
请求引擎 | 1 个 / Service |
| Host | <Host> |
虚拟主机(域名) | 1~N 个 / Engine |
| Context | <Context> |
Web 应用 | 1~N 个 / Host |
| Wrapper | (内部) | 单个 Servlet | 1~N 个 / Context |
实际应用建议
- 多域名部署 :配置多个
<Host>,实现site1.com和site2.com指向不同应用。 - 性能调优 :调整
Connector的maxThreads、acceptCount等参数。 - 安全隔离 :不同
Host可使用不同appBase,实现应用隔离。 - 开发便利 :设置
Context reloadable="true"实现热加载。
通过理解这些核心组件及其协作机制,你可以更高效地配置、部署和调优 Tomcat 应用服务器。
