tomcat

发布于:2025-08-13 ⋅ 阅读:(15) ⋅ 点赞:(0)

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. 资源访问模式
静态请求
动态请求
客户端
Nginx/Apache
Tomcat业务服务器
HTML/CSS/JS
数据库
  • 移动端优化: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安装步骤
  1. 下载依赖包

  2. 部署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 "";
    }
}