web应用服务器TOMCAT
一、WEB技术演进
1. HTTP协议与B/S架构
- C/S模式:基于TCP/UDP的底层通信(如QQ、云音乐),需安装客户端。
- B/S模式诞生:
- 1990年HTTP协议+浏览器出现,通过文本传输HTML渲染网页。
- 初期:静态网页(HTML/CSS),仅展示文字/图片。
- 动态网页革命:
- JavaScript:由网景公司推出,实现前端交互。
- 后端动态生成技术:CGI → ASP/PHP/JSP,在服务端生成动态HTML。
2. 前端三大核心技术
技术 | 核心作用 | 关键发展 |
---|---|---|
HTML | 定义网页内容结构 | 超文本标签描述文本/多媒体,依赖浏览器渲染(示例:基础页面结构代码) |
CSS | 控制样式与布局 | 1996年CSS 1.0 → 1998年CSS 2.0 → 模块化CSS 3.0,解决浏览器兼容性问题 |
JS | 实现动态交互逻辑 | 1995年LiveScript → JavaScript → 1997年ECMAScript标准 → 2008年V8引擎 → Node.js(前后端通用) |
3. 异步通信革新
- 同步问题:页面整体刷新导致资源浪费(如表单提交失败需重填)。
- 解决方案:
- 标签(1996):局部内容加载。
- Ajax技术(1998):核心对象,实现后台数据交换+局部更新,推动前后端分离。
- 数据格式:早期XML → 主流JSON。
二、WEB框架与架构演进
1. 资源访问模式
- 移动端优化:App内置静态资源,减少网络请求。
2. 后端架构演进
架构类型 | 特点 | 优缺点 |
---|---|---|
单体架构 | 所有功能集成单应用(如JSP/Servlet打包为WAR) | ✅ 开发/部署简单 ❌ 耦合度高、扩展难、单点故障影响全局 |
微服务 | SOA子集,按业务拆分独立服务(如用户服务、支付服务) | ✅ 松耦合、独立部署、技术栈灵活 ❌ 复杂度高、需分布式事务/服务治理 |
3. 主流微服务框架
- Dubbo:
- 阿里开源 → Apache顶级项目
- 高性能Java RPC框架,依赖Zookeeper实现服务注册/发现。
- Spring Cloud:
- 完整微服务解决方案
- 基于HTTP RESTful通信,模块化设计(如Eureka注册中心、Config配置中心)。
三、关键架构对比
维度 | 单体架构 | 微服务架构 |
---|---|---|
部署单元 | 单一WAR包 | 多个独立服务 |
数据库 | 共享单一数据库 | 独立数据库或混合模式 |
扩展性 | 水平复制整体应用 | 按服务粒度扩展 |
适用场景 | 小型应用 | 复杂大型系统 |
Tomcat 功能详解
Tomcat 概述
# Tomcat 是轻量级开源 Web 应用服务器
# 主要功能:
# 1. 处理静态 HTML 页面
# 2. 作为 Servlet/JSP 容器
# 3. 支持 Java EE Web 规范(Servlet/JSP)
# 适用场景:中小型系统、中低并发场景
2安装部署
# ===== 安装 Java 环境 =====
yum install java-1.8.0-openjdk.x86_64 -y # 安装 OpenJDK
java -version # 验证安装
# ===== 安装 Tomcat =====
tar zxf apache-tomcat-9.0.107.tar.gz -C /usr/local/ # 解压
mv /usr/local/apache-tomcat-9.0.107/ /usr/local/tomcat # 重命名
# ===== 启动 Tomcat =====
cd /usr/local/tomcat/bin/
./startup.sh # 启动脚本
# ===== 验证启动 =====
netstat -antulp | grep 8080 # 检查监听端口
curl http://localhost:8080 # 测试访问
目录结构解析
/usr/local/tomcat/
├── bin # 启停脚本
├── conf # 配置文件 ★
│ ├── server.xml # 主配置
│ ├── web.xml # 全局部署描述符
│ └── context.xml # 上下文配置
├── lib # 依赖库
├── logs # 日志 ★
├── webapps # 应用部署目录 ★
├── work # JSP 编译缓存
└── temp # 临时文件
核心配置文件说明
<!-- server.xml 片段 -->
<Connector
port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="500" <!-- 最大并发线程 -->
minSpareThreads="50" <!-- 最小空闲线程 -->
acceptCount="100" <!-- 等待队列长度 -->
/>
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost"
appBase="webapps"
unpackWARs="true"
autoDeploy="true">
</Host>
</Engine>
常用运维命令
# 查看实时日志
tail -f /usr/local/tomcat/logs/catalina.out
# 线程状态监控
ps -Lf <tomcat_pid> | wc -l
# 内存分析
jcmd <pid> GC.heap_info
# 生成线程转储
kill -3 <tomcat_pid>
四、结合反向代理实现Tomcat部署
Nginx单机反向代理配置
# /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name lee.timinglee.org;
# 静态资源处理
location ~* \.(ico|png|gif|jpg|css|js)$ {
root /webdata/nginx/static;
expires 30d; # 客户端缓存30天
}
# 动态请求转发到Tomcat
location ~ \.jsp$ {
proxy_pass http://172.25.254.10:8080; # Tomcat地址
# 关键头部信息透传
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 超时设置(秒)
proxy_connect_timeout 60;
proxy_read_timeout 300;
proxy_send_timeout 300;
}
# 错误页面统一处理
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/nginx/html;
}
}
Tomcat集群负载均衡
4.3.1 Nginx负载均衡配置
# 定义Tomcat服务器组
upstream tomcat_cluster {
# 会话保持策略(三选一):
# ip_hash; # 基于客户端IP
# hash $cookie_JSESSIONID; # 基于Session ID
least_conn; # 最少连接数(推荐)
# 服务器配置 weight=权重 max_fails=最大失败次数 fail_timeout=失败超时
server 172.25.254.10:8080 weight=3 max_fails=2 fail_timeout=30s;
server 172.25.254.20:8080 weight=2 max_fails=2 fail_timeout=30s;
server 172.25.254.30:8080 backup; # 备份节点
}
server {
location ~ \.jsp$ {
proxy_pass http://tomcat_cluster; # 指向服务器组
# 健康检查(Nginx Plus功能)
# health_check interval=5s fails=3 passes=2;
}
}
4.3.2 Session共享解决方案
问题根源:HTTP是无状态协议,负载均衡导致请求可能分发到不同Tomcat
解决方案:
1. Sticky Session(会话粘滞)
- 优点:实现简单
- 缺点:故障转移时丢失会话
2. Session复制(Tomcat集群广播)
- 配置:server.xml中配置<Cluster>
- 缺点:网络开销大,扩展性差
3. 集中存储(推荐)
- 存储介质:Redis/Memcached
- 工具:memcached-session-manager(MSM)
五、Memcached集成
5.1 Memcached安装与配置
# 安装
yum install memcached libevent-devel -y
# 配置文件 /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="256" # 内存大小(MB)
OPTIONS="-l 0.0.0.0" # 监听所有IP
# 启动服务
systemctl enable --now memcached
5.2 Memcached操作示例
# Telnet操作
telnet localhost 11211
> add user_session 0 1800 15 # key,flags,过期时间(秒),数据长度
> SESSION_DATA_12345 # 输入数据
STORED
> get user_session # 读取数据
VALUE user_session 0 15
SESSION_DATA_12345
> stats # 查看统计信息
六、Session共享服务器(MSM)
MSM安装步骤
下载依赖包
部署JAR包
# Tomcat的lib目录存放所有JAR
/usr/local/tomcat/lib/
├── msm-kryo-serializer-2.3.2.jar
├── kryo-3.0.3.jar
├── asm-5.2.jar
├── memcached-session-manager-2.3.2.jar
└── spymemcached-2.12.3.jar
6.3 Tomcat配置
Tomcat节点1配置 (172.25.254.10)
<!-- /usr/local/tomcat/conf/context.xml -->
<Context>
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
failoverNodes="n1" <!-- 主故障转移节点 -->
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
<!-- 高级配置 -->
sessionBackupAsync="false"
backupThreadCount="4"
lockingMode="auto"
/>
</Context>
Tomcat节点2配置 (172.25.254.20)
<Manager ...
memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
failoverNodes="n2" <!-- 配置不同的故障节点 -->
... />
6.4 Nginx最终配置
upstream tomcat_cluster {
hash $cookie_JSESSIONID; # 基于Session ID路由
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}
server {
location ~ \.jsp$ {
# 添加Session跟踪头
proxy_set_header X-Session-Id $cookie_JSESSIONID;
proxy_pass http://tomcat_cluster;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}