Tomcat Web应用服务器笔记

笔记说明:本文档旨在系统性地梳理Java Web应用服务器Tomcat的核心概念、它与前后端技术栈的关系、从单体到微服务的架构演进,并提供基础安装、与Nginx整合以及Session共享高可用等关键实验步骤,作为学习和配置的参考手册。

第一部分:核心概念与架构

1.1 Web技术基础与演进

理解Tomcat的作用,需要先了解它所在的Web技术栈。

  • B/S模式:浏览器/服务器模式,基于HTTP协议,是当前主流。

  • 前端三大核心技术

    • HTML:网页的结构骨架。

    • CSS:网页的样式美化(版本1.0/2.0/3.0)。

    • JavaScript:网页的行为引擎,Node.js的出现使其成为前后端通用语言。

  • 同步与异步交互(Ajax)

    • 同步:请求后页面阻塞等待,需整体刷新。

    • 异步(Ajax) :基于XMLHttpRequest对象,实现页面局部更新,不阻塞用户操作。

1.2 后台应用架构演进

Tomcat是部署Java后台应用的传统容器,其部署方式随架构演进。

  1. 单体架构

    • 定义:所有功能模块(订单、支付、用户等)整合在一个工程中,打包为WAR包,部署在单一服务器进程(如Tomcat)中。

    • 优点:开发测试简单,技术栈统一,适合小型项目。

    • 缺点:模块耦合度高,一个小修改需整体重启,水平扩展时需复制整个应用。

    • 代表:部署在Tomcat、Jetty等Web应用服务器。

  2. 微服务架构

    • 定义:按业务边界拆分为多个独立服务,每个服务可独立开发、部署和运行。

    • 核心特征:服务松耦合、独立技术栈、独立扩展、轻量级通信(通常为HTTP/RESTful)。

    • 代表框架

      • Dubbo:Java RPC框架,常配合Zookeeper,高性能。

      • Spring Cloud:微服务全家桶,基于HTTP/RESTful通信,生态丰富。

第二部分:Tomcat基础实验

2.1 Tomcat安装部署

环境准备:需要先安装JDK。

  1. 下载与基础部署

    bash

    复制代码
    # 安装JDK
    yum install java-1.8.0-openjdk.x86_64 -y
    
    # 下载并解压Tomcat 9
    wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.115/bin/apache-tomcat-9.0.115.tar.gz
    tar zxf apache-tomcat-9.0.115.tar.gz -C /usr/local
    cd /usr/local && mv apache-tomcat-9.0.115 tomcat
    
    # 启动测试
    /usr/local/tomcat/bin/startup.sh
    netstat -antlupe | grep 8080   # 验证8080端口监听
  2. Systemd服务化配置(便于管理)

    bash

    复制代码
    # 创建tomcat用户并授权
    useradd -s /sbin/nologin -M tomcat
    chown tomcat.tomcat /usr/local/tomcat -R
    
    # 创建环境变量文件
    vim /usr/local/tomcat/conf/tomcat.conf
    JAVA_HOME=/etc/alternatives/jre
    
    # 创建systemd服务文件
    vim /lib/systemd/system/tomcat.service
    
    [Unit]
    Description=Tomcat
    After=syslog.target network.target
    
    [Service]
    Type=forking
    EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
    ExecStart=/usr/local/tomcat/bin/startup.sh
    ExecStop=/usr/local/tomcat/bin/shutdown.sh
    PrivateTmp=true
    User=tomcat
    Group=tomcat
    
    [Install]
    WantedBy=multi-user.target
    
    systemctl daemon-reload && systemctl enable --now tomcat
    netstat -antlupe | grep java   # 验证服务启动(8005/8080端口)

第三部分:Nginx+Tomcat整合实验

3.1 单体架构整合

使用Nginx作为反向代理,将动态请求(如JSP)转发给后端的Tomcat处理。

  1. Nginx配置

    nginx

    复制代码
    # 在 /usr/local/nginx/conf/conf.d/ 下创建vhosts.conf
    server {
        listen 80;
        server_name app.timinglee.org;
    
        location ~* \.jsp$ {
            proxy_pass http://172.25.254.10:8080;   # 转发到Tomcat
        }
    }
  2. 准备测试页面并验证

    bash

    复制代码
    # 在Tomcat的ROOT目录下创建测试页面
    echo 'test page' > /usr/local/tomcat/webapps/ROOT/test.jsp
    nginx -s reload
    # 浏览器访问 http://app.timinglee.org/test.jsp
3.2 Tomcat负载均衡配置

当有多个Tomcat实例时,可以通过Nginx进行负载分发。

  1. Nginx配置upstream

    nginx

    复制代码
    upstream tomcat {
        # hash $cookie_JSESSIONID;   # 可选:基于Cookie的会话保持
        server 172.25.254.10:8080;
        server 172.25.254.20:8080;
    }
    
    server {
        listen 80;
        server_name app.timinglee.org;
    
        location ~* \.jsp$ {
            proxy_pass http://tomcat;          # 转发到upstream组
        }
    }
  2. 同步测试页面 :将test.jsp同步到另一台Tomcat的相应目录。

  3. 验证:重载Nginx,用不同浏览器或工具访问,观察请求是否被分发到不同Tomcat。

第四部分:Session共享高可用实验

在负载均衡环境下,必须解决Session共享问题,确保用户请求切换到不同Tomcat时,登录状态不丢失。本实验使用Memcached作为集中式Session存储。

4.1 环境准备
  1. 在所有Tomcat节点安装Memcached

    bash

    复制代码
    dnf install memcached -y
    vim /etc/sysconfig/memcached
    OPTIONS="-l 0.0.0.0,::1"   # 监听所有接口
    systemctl enable --now memcached
    netstat -antlupe | grep 11211  # 验证端口
  2. 部署Memcached-Session-Manager jar包

    • 该管理器用于将Tomcat的Session数据存储到Memcached。

    • 需要将memcached-session-managerkryo等相关jar包复制到所有Tomcat的lib目录下。

    bash

    复制代码
    # 假设jar包已下载到当前目录
    cp *.jar /usr/local/tomcat/lib/
    scp *.jar root@172.25.254.20:/usr/local/tomcat/lib/  # 同步到另一节点
4.2 配置Tomcat会话管理器

编辑每个Tomcat的 conf/context.xml 文件,添加Manager配置。

  • RS1(172.25.254.10)配置

    xml

    复制代码
    <Context>
        ...
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
            memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
            failoverNodes="n1"    <!-- 本机故障时,Session备份到n2 -->
            requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
            transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
        />
    </Context>
  • RS2(172.25.254.20)配置

    xml

    复制代码
    <Context>
        ...
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
            memcappedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
            failoverNodes="n2"    <!-- 本机故障时,Session备份到n1 -->
            requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
            transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
        />
    </Context>
4.3 验证会话共享
  1. 重启所有Tomcat服务:systemctl restart tomcat

  2. 测试逻辑

    • 通过Nginx访问应用(如部署了一个有登录功能的Web应用),登录后产生Session。

    • 模拟故障,停止当前处理请求的Tomcat节点。

    • 刷新页面,请求会被Nginx转发到另一个Tomcat节点。

    • 验证:登录状态应依然保持,说明Session未丢失,成功从Memcached中恢复。

总结

Tomcat作为经典的Java Web容器,是理解从单体应用 部署到微服务 架构演进的重要基础。在实际生产环境中,它通常位于Nginx 等反向代理之后,处理动态内容。解决负载均衡下的Session共享问题(如使用Memcached或Redis)是实现应用高可用的关键一步。

相关推荐
遗憾随她而去.1 分钟前
高德地图自定义点标记: SVG vs HTML+CSS两种方案
前端·css
_饭团2 分钟前
C语言数组全解析:从入门到精通
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
陕西小伙伴网络科技有限公司2 分钟前
kettle单转换实现分页查询
开发语言·前端·javascript
踩着两条虫5 分钟前
低代码 + AI,到底是生产力革命,还是下一代“技术债务”?
前端·人工智能·低代码
南知意-24 分钟前
cloud-app-admin:一款现代化、开箱即用的 Vue 3 后台管理模板
前端·javascript·vue.js·开源·开源项目
前端小王呀28 分钟前
Vue 中高级开发面试题及答案
前端·javascript·vue.js
紫_龙29 分钟前
最新版vue3+TypeScript开发入门到实战教程之watch与watchEffect对比区别
前端·vue.js·typescript
啪叽30 分钟前
别再手写 if-else 选字体颜色了,CSS contrast-color() 来帮你处理
前端·css
刘宇琪1 小时前
JavaScript单页应用(SPA)首次加载慢优化方案
前端
CoovallyAIHub1 小时前
Agency-Agents(52k+ Stars):140+ 个角色模板,让 AI 编程助手变成一支专业团队
前端·算法·编程语言