目录
Tomcat(全称 Apache Tomcat)是由 Apache 软件基金会开发和维护的一款 开源的 Web 服务器与 Servlet 容器,用于运行基于 Java 的 Web 应用程序。它广泛应用于中小型企业和开发测试环境中,是学习和部署 Java Web 的首选服务器。
Tomcat 基本简介
- 开发者:Apache 软件基金会
- 编程语言:Java
- 最新版本:可参考官网 https://tomcat.apache.org
- 核心功能:
- 支持 Servlet 规范(如 Servlet 4.0)
- 支持 JSP(Java Server Pages)
- 支持 WebSocket
- 支持 HTTP/1.1、HTTP/2 等协议(版本依赖)
Tomcat 实际上是一个轻量级的 Servlet 容器(Servlet Container),它也可以当作 HTTP Web 服务器来使用,但它不是一个完整的 Java EE 应用服务器(如 GlassFish、WildFly)。
Tomcat 架构组成
Tomcat 主要由以下几个核心组件组成:
- Server
- 表示整个服务器实例,server.xml 配置文件中最顶层的元素。
- Service
- Server 可以包含多个 Service。
- 每个 Service 由 Connector 和 Engine 两部分组成。
- Connector(连接器)
- 负责与客户端通信(接收 HTTP 请求,返回响应)。
- 支持协议:HTTP、AJP 等。
- 常见配置:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>
- Engine(引擎)
- 处理 Connector 传入的请求。
- 属于 Service 内部组件。
- 包含 Host 容器。
- Host(虚拟主机)
- 每个 Host 表示一个虚拟主机。
- 一个 Host 包含多个 Web 应用(Context)。
- Context(上下文)
- 表示一个 Web 应用,通常对应 webapps 下的一个目录。
- 每个 Context 对应一个 web.xml 文件。
Tomcat 的目录结构
apache-tomcat-<version>/
├── bin/ # 启动与关闭脚本(startup.sh / shutdown.bat)
├── conf/ # 配置文件(server.xml、web.xml 等)
├── lib/ # 所有 Tomcat 运行所需的 jar 包
├── logs/ # 日志文件
├── webapps/ # 默认 Web 应用部署目录
├── work/ # Servlet/JSP 编译后的临时文件
├── temp/ # 临时文件
Tomcat 的工作原理
- 启动 Tomcat(执行 bin/startup.sh)
- 初始化配置(加载 server.xml)
- 创建 Connector,监听端口(如 8080)
- 接收到 HTTP 请求后交给对应 Context
- Servlet 容器处理请求:
- 查找对应 Servlet
- 调用其 service() 方法
- 返回处理结果给客户端
Tomcat 的配置文件
conf / server.xml
Tomcat 的主配置文件,管理服务、端口、连接器等。conf / web.xml
默认 Web 应用的全局配置文件,比如 MIME 类型映射、默认欢迎页、错误页面等。conf / context.xml
所有 Web 应用的共享 Context 配置。
Tomcat 与其他服务器对比
服务器 | 类型 | 是否支持 Java EE 完整规范 | 特点 |
---|---|---|---|
Tomcat | Web服务器+Servlet容器 | 否 | 轻量、高性能、易于部署 |
Jetty | Servlet 容器 | 否 | 模块化、嵌入式应用多 |
GlassFish | Java EE 应用服务器 | 是 | 官方 Java EE 实现,重量级 |
WildFly | Java EE 应用服务器 | 是 | 高性能企业级服务器 |
Tomcat 使用场景
- Java Web 开发与学习
- 轻量级 Web 应用部署
- 微服务架构中的 Servlet 容器嵌入
- 嵌入式服务器(可内嵌到 Spring Boot)
Tomcat 与 Spring Boot
Spring Boot 内置了 Tomcat,默认使用的是 org.apache.catalina.startup.Tomcat
启动类,实现嵌入式部署:
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
可以通过配置文件指定端口:
server:
port: 8081
常见问题与优化
- 启动慢 / 内存不足
- 优化 JVM 参数(setenv.sh 或 catalina.sh)
- 分析日志查找瓶颈
- 端口占用
- 修改 server.xml 中
- Session 共享问题
- 使用 Redis / 数据库持久化 session
- 或配置 Tomcat 集群
- JSP 编译慢
- 预编译 JSP 或使用更高版本的 JDK