目录
TomCat基本概念
Tomcat 是 Apache 软件基金会的核心项目,是开源的 Java Servlet 容器和 Web 服务器,支持 Java Servlet、JSP、WebSocket 等核心技术。以下是 Tomcat 的深度解析:
一、核心架构与组件
1. 模块化架构
graph TD
A[Server] --> B[Service]
B --> C[Connector]
B --> D[Engine]
D --> E[Host]
E --> F[Context]
F --> G[Wrapper]
F --> H[Listener/Filter]
- Server:顶级容器,代表整个 Tomcat 实例
- Service:服务单元(含 Connector + Engine)
- Connector:网络连接器(HTTP/AJP)
- Engine:请求处理引擎(虚拟主机管理器)
- Host:虚拟主机(域名映射)
- Context:Web 应用上下文(对应 WAR 包)
- Wrapper:Servlet 包装器(管理单个 Servlet)
二、核心配置文件
1. server.xml(主配置文件)
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<!-- HTTP 连接器 -->
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="200" acceptCount="100"/>
<!-- Engine 容器 -->
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- Context 配置 -->
<Context path="/myapp" docBase="myapplication" reloadable="true"/>
</Host>
</Engine>
</Service>
</Server>
2. 关键配置文件
文件 | 作用 |
---|---|
web.xml | 应用级配置(Servlet/Filter 定义) |
context.xml | Context 容器配置(数据源等) |
catalina.properties | 全局属性配置 |
logging.properties | 日志系统配置 |
三、核心处理流程
请求处理链:
sequenceDiagram 客户端->>+Connector: HTTP请求 Connector->>+Engine: 创建Request/Response Engine->>+Host: 匹配虚拟主机 Host->>+Context: 定位Web应用 Context->>+Wrapper: 查找Servlet Wrapper-->>-Context: 执行service() Context-->>-Host: 返回响应 Host-->>-Engine: 传递结果 Engine-->>-Connector: 输出响应 Connector-->>-客户端: HTTP响应
Pipeline-Valve 机制:
- 每个容器都有 Pipeline 和 Valve 链
- Valve 类似 Filter 链式处理请求
- BasicValve 最终调用 Servlet 的 service() 方法
四、关键特性详解
1. 类加载机制
classDiagram
ClassLoader <|-- URLClassLoader
URLClassLoader <|-- WebappClassLoader
WebappClassLoader : 应用隔离加载
WebappClassLoader : 打破双亲委派(JSP/Servlet)
- 隔离加载:每个 WebApp 使用独立 ClassLoader
- 加载优先级:
- JVM 核心类
$CATALINA_HOME/lib
共享库- WebApp 的
/WEB-INF/lib
和/WEB-INF/classes
2. 会话管理
- 实现方式:
// 创建会话 HttpSession session = request.getSession(true); // 存储数据 session.setAttribute("user", userObject);
- 持久化方案:
- StandardManager:默认(内存存储,重启丢失)
- PersistentManager:文件/数据库存储
- 集群复制:DeltaManager 等
3. JSP 处理流程
.jsp 文件 → Jasper 编译器 → .java 文件 → javac → .class 文件 → Servlet 执行
五、性能优化指南
1. Connector 调优
<Connector
port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
maxThreads="500"
minSpareThreads="20"
acceptCount="100"
connectionTimeout="20000"
maxConnections="1000"/>
- 协议选择:
- BIO(阻塞式):已废弃
- NIO(非阻塞):通用推荐
- NIO2(AIO):Linux 最佳
- APR(Native):极致性能
2. JVM 参数优化
# catalina.sh 配置
export JAVA_OPTS="-server -Xms1024m -Xmx2048m
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
-XX:+UseG1GC -XX:MaxGCPauseMillis=200"
3. 资源泄漏防护
<!-- context.xml 配置 -->
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resources cachingAllowed="true" cacheMaxSize="102400"/>
</Context>
六、安全管理实践
1. 安全加固措施
- 禁用管理界面(生产环境)
- 修改 shutdown 端口和指令
- 文件系统权限隔离
- 定期升级版本(CVE 修复)
2. 访问控制配置
<!-- web.xml 片段 -->
<security-constraint>
<web-resource-collection>
<url-pattern>/admin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
七、部署模式对比
部署方式 | 适用场景 | 特点 |
---|---|---|
独立部署 | 开发/测试环境 | 简单快捷 |
前端代理 | 生产环境(Nginx+Tomcat) | 动静分离+负载均衡 |
嵌入式部署 | Spring Boot应用 | 无容器依赖 |
Tomcat集群 | 高并发场景 | 需要Session复制 |
八、监控与诊断
1. 内置监控接口
- JMX 监控:
com.sun.management.jmxremote
- Probe:轻量级监控应用(替代 manager)
2. 关键监控指标
指标 | 健康阈值 | 工具 |
---|---|---|
线程池使用率 | <80% | JConsole |
Heap 内存使用 | <70% | VisualVM |
GC 暂停时间 | <200ms | GC log analyzer |
请求处理时间 | P95<500ms | Access Log |
九、版本演进路线
版本 | 发布时间 | 核心特性 |
---|---|---|
Tomcat 10 | 2021 | Servlet 6.0 / JSP 3.1 |
Tomcat 9 | 2018 | HTTP/2 / TLS 1.3 |
Tomcat 8 | 2014 | WebSocket 1.1 |
Tomcat 7 | 2011 | 内存泄漏防护 |
十、最佳实践总结
配置规范:
- 生产环境禁用 autoDeploy
- 设置 reloadable="false"
- 配置明确的 Context path
部署建议:
# 标准目录结构 webapps/ ├── ROOT/ # 根应用 ├── myapp.war # 自动解压部署 └── lib/ # 共享库(谨慎使用)
故障排查口诀:
- 看日志:catalina.out / localhost.log
- 查线程:
jstack <pid>
- 检内存:MAT 分析堆转储
- 测网络:TCP 连接状态监控
Nginx+Tomcat负载均衡
一、架构原理
角色分工
- Nginx:作为反向代理与负载均衡器,接收客户端请求并按算法分发至后端Tomcat服务器。
- Tomcat:作为应用服务器集群,处理动态请求(如JSP)。
- 动静分离:Nginx直接处理静态资源(HTML/图片),动态请求转发至Tomcat,显著提升性能。
负载均衡策略
- 轮询(默认):请求按时间顺序依次分发。
- 加权轮询:通过
weight
参数分配服务器负载比例(示例:server 192.168.1.2:8080 weight=2;
)。 - IP哈希:基于客户端IP固定分配服务器,解决Session共享问题,但局域网用户可能失效。
二、核心配置步骤
1. Nginx配置(nginx.conf)
http {
# 定义Tomcat服务器组
upstream tomcat_cluster {
server 192.168.1.2:8080 weight=1; # Tomcat实例1
server 192.168.1.3:8080 weight=1; # Tomcat实例2
}
server {
listen 80;
location / {
proxy_pass http://tomcat_cluster; # 请求转发至集群
}
# 动静分离:静态资源由Nginx处理
location ~ .*\.(html|jpg|js)$ {
root /usr/local/nginx/html;
}
# 动态请求转发至Tomcat
location ~ .*\.jsp$ {
proxy_pass http://tomcat_cluster;
}
}
}
关键点:
upstream
命名需与proxy_pass
一致。- 静态资源路径通过
root
指定。
2. Tomcat配置
- 多实例部署:单机多Tomcat需修改
server.xml
中的端口(如Shutdown端口、HTTP Connector端口)避免冲突。 - 应用一致性:所有Tomcat节点需部署相同版本的Web应用。
三、会话保持(Session共享)
IP哈希:Nginx通过
ip_hash
算法将同一用户请求固定到同一Tomcat。upstream tomcat_cluster { ip_hash; server 192.168.1.2:8080; server 192.168.1.3:8080; }
局限:服务器宕机导致Session丢失,且不适用于公网IP相同的局域网用户。
Session共享方案
- Memcached/Redis:将Session存储于分布式缓存,Tomcat通过
memcached-session-manager
等工具读写。 - 配置示例:在Tomcat的
context.xml
中添加Memcached节点信息。
- Memcached/Redis:将Session存储于分布式缓存,Tomcat通过
四、部署验证
- 测试负载均衡:
- 多次访问Nginx的IP地址,观察不同Tomcat节点的日志或页面标识(如端口号)。
- 动静分离验证:
- 访问静态资源(如
http://nginx_ip/img/photo.jpg
)应直接由Nginx响应;访问JSP页面则由Tomcat处理。
- 访问静态资源(如
五、性能优化建议
- 健康检查:通过Nginx的
max_fails
和fail_timeout
参数屏蔽故障节点(示例:server 192.168.1.2:8080 max_fails=2 fail_timeout=10s;
)。 - 连接池优化:调整Tomcat的
maxThreads
和acceptCount
参数以提升并发能力。 - 缓存加速:Nginx开启
gzip
压缩静态资源,减少传输量。
附:拓扑示例
客户端 → Nginx(负载均衡)
├→ Tomcat1(动态请求)
└→ Tomcat2(动态请求)
静态请求由Nginx直接响应(无需转发)。