Tomcat 知识点总结
一、基础概念
1. 什么是 Tomcat
- Tomcat 是开源的 Web 容器 (Servlet 容器),由 Apache 基金会维护,用 Java 开发。
- 作用:运行 Servlet、JSP;接收客户端 http 请求,调用 Java 程序,返回响应。
- 定位:不是完整 JavaEE 服务器(没有 EJB 等),只是 Servlet 容器;配合 SpringBoot 内置 Tomcat 非常常用。
Web 服务器(Nginx/Apache):处理静态资源;Tomcat:处理 Java 动态资源。
2. 版本对应关系(重点)
| Tomcat 版本 | Servlet | JSP | JDK 要求 |
|---|---|---|---|
| Tomcat8.5 | 3.1 | 2.3 | JDK8+ |
| Tomcat9 | 4.0 | 2.3 | JDK8+ |
| Tomcat10 | 5.0 | 3.0 | JDK11+ |
⚠️ Tomcat10 重大变化:jakarta.包名替换 javax.,老项目直接跑会报错!SpringBoot2.x 用 Tomcat9;SpringBoot3.x 用 Tomcat10
二、Tomcat 目录结构(解压版)
apache‑tomcat‑xxx
├── bin #启动关闭脚本
│ startup.bat/sh、shutdown.bat/sh
├── conf #核心配置文件夹(最重要)
│ ├─server.xml #服务主配置
│ ├─web.xml #全局web应用配置
│ ├─context.xml #数据源、全局上下文配置
│ └─tomcat‑users.xml #管理页面账号密码
├── lib #tomcat自身依赖jar包
├── logs #日志输出目录 catalina.out核心日志
├── temp #临时文件
├── webapps #默认部署项目位置
└── work #JSP编译后的Servlet存放目录,JSP→java→class
work 目录:删除 work,重启 tomcat 会重新编译 jsp,可以解决 jsp 缓存问题。
三、核心配置文件 conf
1. server.xml(主配置文件)
整体层级结构
<Server> <!--整个tomcat实例,端口8005(shutdown端口,接收关闭指令) -->
<Service name="Catalina"> <!--服务,可以配置多个Service,代表多套服务实例-->
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>
<!--HTTP连接器:8080是默认访问端口;redirectPort是https重定向端口-->
<Engine name="Catalina" defaultHost="localhost"> <!--引擎,处理请求,选择Host虚拟机-->
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<!--虚拟主机:appBase项目部署目录;autoDeploy热部署,war自动解压部署-->
<Context docBase="/xxx/myweb" path="/myweb"/>
<!--Context:单独web应用上下文;docBase实际项目路径,path访问路径-->
</Host>
</Engine>
</Service>
</Server>
四个端口含义(面试高频)
- 8005 (Server 端口):shutdown 端口,tomcat 内部关闭端口,发送 SHUTDOWN 指令关闭 tomcat;默认只能本机访问。
- 8080(HTTP Connector):浏览器访问 http 端口。
- 8009(AJP Connector):AJP 协议端口,用于 Nginx 和 Tomcat 通信;新版本 tomcat8.5 之后默认已经移除 AJP 连接器。
- 8443(HTTPS redirectPort):https 重定向端口,配置 SSL 时生效。
修改访问端口:改 Connector 的 port,重启 tomcat 生效。
2. Context 上下文配置
两种配置 Context 的方式:
1)server.xml 的 Host 内部写<Context>(不推荐,重启 tomcat 才生效)
2)conf/Catalina/localhost/项目名.xml,单独 xml 文件配置,热加载,不需要重启 tomcat
<Context docBase="D:\demo" reloadable="true"/>
reloadable="true":开启热部署,类修改自动重新加载项目;开发用,生产关闭,耗性能。
3. tomcat‑users.xml
配置 tomcat 管理后台账号,访问http://localhost:8080/manager/html
<user username="admin" password="123456" roles="manager‑gui"/>
4. web.xml
全局 web 配置,所有 web 应用继承;可以配置 servlet、filter、mime 类型、默认欢迎页、错误页面。
四、项目部署方式
方式 1:直接丢 webapps 下
- war 包直接放到 webapps,autoDeploy=true 自动解压部署;访问地址
http://ip:8080/war包名/ - ROOT 文件夹:特殊!ROOT 下的项目访问不需要项目名,直接 http://ip:8080/
方式 2:Context 配置外部路径部署(docBase 指向磁盘别的目录)
方式 3:IDE 部署(IDEA/Eclipse)
IDEA 不会直接使用解压 tomcat 的 webapps;idea 单独生成一份部署配置。
五、Tomcat 运行模式(Connector protocol)
- BIO(阻塞 IO)Tomcat7 默认 :一个请求一个线程;并发差。
protocol="HTTP/1.1" - NIO(非阻塞 IO)Tomcat8 默认:java nio,多路复用;性能更好
- NIO2:基于操作系统异步 IO
- APR 模式:调用本地 C 库,性能最高,需要安装 apr 库;生产可选。
Tomcat8 默认 NIO;SpringBoot 内置 tomcat 默认 NIO。
六、Tomcat 架构原理(请求流程)
- Connector(连接器):负责接收 Socket 网络请求,解析 http 协议;把请求交给 Engine。
- Engine(引擎):接收 Service 全部请求,根据域名匹配 Host 虚拟主机。
- Host(虚拟主机):匹配虚拟主机;匹配 Context 上下文(web 应用)。
- Context:当前 web 项目;匹配里面 Servlet 处理业务。
整体流程: 浏览器请求 → Connector (端口监听,解析 http) → Engine → Host 虚拟主机 → Context 应用 → Filter → Servlet → 返回响应
七、常见问题 & 调优(面试重点)
1. JVM 参数配置
bin/catalina.bat (sh) 增加 JVM 堆参数
‑Xms512m ‑Xmx1024m ‑XX:+UseG1GC
- Xms 初始堆;Xmx 最大堆,一般设置 Xms=Xmx 减少扩容消耗
2. Connector 连接器调优(server.xml)
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="200" minSpareThreads="20" acceptCount="100"/>
- maxThreads:最大工作线程数 默认 200(tomcat 最多同时处理请求数)
- minSpareThreads:空闲保留线程
- acceptCount:请求排队队列;线程全部忙之后,新来请求排队;队列满直接返回连接拒绝。
注意:maxThreads 不是越大越好,受服务器 CPU 内存限制。
3. 乱码问题
1)GET 乱码:Tomcat8 之后默认 URI 编码 UTF‑8;7 及之前默认 ISO‑8859‑1; 2)POST 乱码:代码 request.setCharacterEncoding ("UTF‑8"); 3)控制台日志 catalina.out 中文乱码:修改 conf/logging.properties,修改日志编码。
4. 常见报错
- 端口占用 java.net.BindException: Address already in use
8080/8005 被别的进程占用;关闭占用进程或者修改 server.xml 端口。
- 404:资源路径错误;项目部署失败;jsp 编译失败;servlet 映射错误;ROOT 部署问题
- 500:java 代码异常;jsp 语法错误;jar 冲突
- 403 manager 后台访问拒绝:tomcat‑users.xml 角色配置缺失,IP 访问限制。
- JSP 修改不生效:清空 work 缓存目录。
八、Nginx+Tomcat 集群(反向代理 + 负载均衡)
- Nginx 做前端反向代理;分发请求后端多台 tomcat;实现集群。
- 问题:session 共享。 解决方案: 1)session 复制(tomcat 自带,性能差不推荐) 2)session 持久化 redis(主流方案,SpringSession)
九、SpringBoot 内置 Tomcat
-
SpringBoot 不需要单独安装 tomcat;内嵌 tomcat 容器,直接 jar 运行。 application.yml 配置示例
server:
port: 8081
tomcat:
max‑threads: 300
SpringBoot3.x 内置 Tomcat10,包名是 jakarta.*