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)是实现应用高可用的关键一步。

相关推荐
candyTong2 小时前
一觉醒来,大模型就帮我排查完页面性能问题
前端·javascript·架构
魔术师Grace2 小时前
我给 AI 做了场入职培训
前端·程序员
三品吉他手会点灯2 小时前
C语言学习笔记 - 20.C编程预备计算机专业知识 - 变量为什么必须的初始化【重点】
c语言·笔记·学习
kobesdu2 小时前
【ROS2实战笔记-12】rosshow:终端里的盲文可视化与无头机器人的现场调试
笔记·机器人·ros·移动机器人
sakiko_2 小时前
UIKit学习笔记1-创建项目(使用UIKit)、使用组件
笔记·学习
玩嵌入式的菜鸡3 小时前
网页访问单片机设备---基于mqtt
前端·javascript·css
前端一小卒3 小时前
我用 Claude Code 的 Superpowers 技能链写了个服务,部署前差点把服务器搞炸
前端·javascript·后端
智者知已应修善业3 小时前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
滑雪的企鹅.4 小时前
HTML头部元信息避坑指南大纲
前端·html
一拳不是超人4 小时前
老婆天天吵吵要买塔罗牌,我直接用 AI 2 小时写了个在线塔罗牌
前端·ai编程