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 小时前
实现网页锚点功能的技术指南
前端·javascript·vue.js·状态模式
这波不该贪内存的1 小时前
Linux文件编程:流与操作全解析
java·服务器·前端
坚持的小马1 小时前
JVM相关笔记-jps
jvm·笔记
归叶再无青1 小时前
企业级web服务(Tomcat开源web应用服务器)
运维·前端·开源·tomcat·bash
土拨鼠烧电路1 小时前
笔记10:新零售风暴:O2O、直播与硬折扣店的颠覆
大数据·笔记·零售
花生柿子1 小时前
在elementui可横向滚动的table中,操作列有时候会透视下面的行
前端·javascript·elementui
前端炒粉1 小时前
AntD Upload + React Uploady + 分片上传 + 断点续传 + 心跳机制(面试及代码)
前端·react.js·前端框架
嵌入式×边缘AI:打怪升级日志2 小时前
基于ESP32S3的智能终端项目--5.显示时间和天气功能
笔记·esp32·freertos·天气·日历
阿珊和她的猫2 小时前
浏览器跨页签数据共享方案
前端·javascript·vue.js·chrome