Tomcat

Tomcat 学习笔记

一、Tomcat 基础认知

1. 核心概念

Tomcat 是 Apache 基金会开发的开源 Servlet 容器,实现了 Java Servlet、JavaServer Pages (JSP) 等规范,是轻量级的 Java Web 服务器,广泛用于开发和部署 Java Web 应用,也是企业级 Java Web 开发的基础组件。

Tomcat 核心目录说明

  • bin:存放 Tomcat 启动、关闭的脚本文件(startup.sh 启动、shutdown.sh 关闭);

  • conf:核心配置文件目录,包含 server.xmlcontext.xmlweb.xml 等关键配置;

  • webapps:Web 应用部署目录,将开发好的 Web 应用包放入此目录可直接部署;

  • logs:Tomcat 运行日志文件目录,用于排查启动和运行故障;

  • lib:Tomcat 运行依赖的 Jar 包目录,第三方扩展包也需放入此目录;

  • temp:Tomcat 临时文件存储目录;

  • work:Tomcat 编译 JSP 生成的 class 文件存储目录。

2. 核心应用场景

  • 单机环境下快速部署和运行 Java Web 应用;

  • 与 Nginx 整合,实现多 Tomcat 节点的负载均衡,提升并发处理能力;

  • 结合 Memcached 实现 Session 会话的集中存储,解决集群中会话丢失问题;

  • 开发环境中作为本地测试服务器,快速调试 JSP/Servlet 程序。

二、实验一:Tomcat 单机安装与部署

1. 实验环境

  • 操作系统:Linux 发行版均可

  • JDK 版本:1.8.0(Tomcat 9 版本依赖 JDK 8 及以上)

  • Tomcat 版本:9.0.107

  • 操作用户:root (服务器管理员权限)

2. 详细操作步骤

步骤 1:安装 JDK 环境(Tomcat 运行依赖)

Tomcat 是 Java 开发的程序,必须先安装 Java 运行环境,此处选择开源的 OpenJDK 1.8:

Bash 复制代码
yum install java-1.8.0-openjdk.x86_64 -y

安装完成后可通过 java -version 验证,输出 1.8.0 版本信息即表示安装成功。

步骤 2:下载 Tomcat 安装包并解压

从 Apache 官方源下载 Tomcat 9.0.107 压缩包,解压到 /usr/local 目录并简化目录名:

Bash 复制代码
# 下载安装包
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.115/bin/apache-tomcat-9.0.107.tar.gz
# 解压到 /usr/local 目录
tar zxf apache-tomcat-9.0.107.tar.gz  -C /usr/local
# 进入 /usr/local 并重命名,简化后续操作
cd /usr/local/
mv apache-tomcat-9.0.107/ tomcat
步骤 3:临时启动 Tomcat 并验证启动状态

通过 bin 目录下的脚本启动 Tomcat,并检查默认 8080 端口的监听状态:

Bash 复制代码
# 进入 Tomcat 启动脚本目录
cd tomcat/bin/
# 启动 Tomcat
./startup.sh
# 验证 8080 端口监听(Tomcat 默认服务端口)
netstat -antlupe | grep 8080

启动成功标识 :执行 ./startup.sh 后输出 Tomcat started.netstat 命令输出包含 :::8080 的 LISTEN 状态。

步骤 4:配置 Tomcat 系统服务(实现开机自启)

临时启动仅适用于测试,配置 systemd 系统服务可实现 Tomcat 开机自启、便捷的启停管理,步骤如下:

  1. 创建 Tomcat 环境配置文件,指定 JAVA_HOME 路径:

    Bash 复制代码
    vim /usr/local/tomcat/conf/tomcat.conf
    # 写入以下内容并保存
    JAVA_HOME=/etc/alternatives/jre
  2. 创建 systemd 服务文件 /lib/systemd/system/tomcat.service

    Bash 复制代码
    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
  3. 创建 Tomcat 专用用户(避免 root 运行,提升服务器安全性):

    Bash 复制代码
    # 创建无登录权限的 tomcat 用户和用户组
    useradd  -s /sbin/nologin -M tomcat
    # 为 tomcat 用户授权 Tomcat 整个目录
    chown  tomcat.tomcat /usr/local/tomcat/ -R
  4. 重载系统服务并设置 Tomcat 开机自启,验证服务状态:

    Bash 复制代码
    # 重载 systemd 配置,使新服务生效
    systemctl daemon-reload
    # 启动 Tomcat 并设置开机自启
    systemctl enable --now tomcat
    # 验证 Tomcat 相关端口监听
    netstat -antlupe | grep java

服务配置成功标识netstat 命令输出 8080(服务端口)和 8005(管理端口)的 LISTEN 状态。

4. 实验截图

5. 核心知识点总结

  1. Tomcat 运行强依赖 JDK,必须保证 JAVA_HOME 路径配置正确,否则无法启动;

  2. ./startup.sh/./shutdown.sh 是临时启停脚本,关闭终端或服务器重启后 Tomcat 会停止;

  3. 为 Tomcat 创建专用运行用户,禁止使用 root 用户运行,可有效降低服务器安全风险;

  4. Tomcat 默认占用 8080 端口,若端口被占用,可修改 conf/server.xml 中的端口配置。

三、实验二:Tomcat + Memcached 实现 Session 会话零丢失

1. 实验背景

Tomcat 单机部署时,重启或宕机会导致用户 Session 会话数据丢失;多 Tomcat 集群部署时,不同节点的 Session 数据相互独立,用户请求被分发到不同节点时会出现会话失效(如重新登录)问题。

Memcached 是轻量级的内存型分布式缓存数据库,将所有 Tomcat 节点的 Session 数据集中存储到 Memcached 中,可实现 Session 共享,达到会话零丢失的效果。

2. 实验环境

  • 两台 Tomcat 服务器:RS1(<172.25.254.10>)、RS2(<172.25.254.20>),均已完成单机部署;

  • Memcached:在两台服务器均部署,默认端口 11211;

  • 依赖包:memcached-session-manager 相关 Jar 包(封装为 jar.zip);

  • 操作用户:root。

3. 详细操作步骤

步骤 1:为 Tomcat 加载 Memcached 相关模块

将 memcached-session-manager 相关 Jar 包复制到 Tomcat 的 lib 目录,并同步到所有 Tomcat 节点(RS1、RS2):

Bash 复制代码
# 解压依赖包压缩包
unzip jar.zip
# 进入解压后的目录
cd jar/
# 复制所有 Jar 包到本地 Tomcat lib 目录
cp * /usr/local/tomcat/lib/
# 将 Jar 包同步到另一台 Tomcat 服务器 RS2
scp * root@172.25.254.20:/usr/local/tomcat/lib/
步骤 2:安装并配置 Memcached

两台服务器均需执行以下操作,实现 Memcached 部署和可远程访问配置:

  1. 安装 Memcached:

    Bash 复制代码
    dnf install memcached -y
  2. 修改 Memcached 配置文件,允许所有地址访问:

    Bash 复制代码
    vim /etc/sysconfig/memcached
    # 确保配置内容如下
    PORT="11211"
    USER="memcached"
    MAXCONN="1024"
    CACHESIZE="64"
    OPTIONS="-l 0.0.0.0,::1"
  3. 启动 Memcached 并验证端口监听:

    Bash 复制代码
    systemctl start memcached
    # 验证 11211 端口监听
    netstat -antluple | grep memcached

Memcached 启动成功标识 :终端输出包含 0.0.0.0:11211::1:11211 的 LISTEN 状态。

步骤 3:配置 Tomcat 关联 Memcached(核心步骤)

修改 Tomcat 核心配置文件 conf/context.xml,添加 Memcached 会话管理配置,RS1 和 RS2 配置仅 ** failoverNodes ** 不同

  1. 配置 RS1(<172.25.254.10>)的 context.xml:

    Bash 复制代码
    [root@RS1 ]#  vim /usr/local/tomcat/conf/context.xml
    # 在 <Context> 标签内添加以下配置,完整文件内容如下
    <Context>
        <!-- 原有监控资源配置,保留不变 -->
        <WatchedResource>WEB-INF/web.xml</WatchedResource>
        <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
        <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
    
        <!-- Memcached 会话管理核心配置 -->
        <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"
         />
    </Context>
  2. 配置 RS2(<172.25.254.20>)的 context.xml:

    Bash 复制代码
    [root@RS2 ]#  vim /usr/local/tomcat/conf/context.xml
    # 仅修改 failoverNodes 为 n2,其余配置与 RS1 一致
    <Context>
        <WatchedResource>WEB-INF/web.xml</WatchedResource>
        <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
        <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
    
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
         memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
         failoverNodes="n2"  # 仅此处与 RS1 不同
         requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
         transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
         />
    </Context>
  3. 重启两台服务器的 Tomcat,使配置生效:

    Bash 复制代码
    systemctl restart tomcat.service

5. 实验截图

6. 核心知识点总结

  1. Memcached 是内存型缓存,适合存储临时的 Session 会话数据,读写速度远高于磁盘;

  2. MemcachedBackupSessionManager 是 Tomcat 的第三方会话管理扩展,实现将 Session 写入 Memcached;

  3. memcachedNodes:配置 Memcached 节点列表,格式为节点名:IP:端口

  4. failoverNodes:配置故障切换节点,当前节点故障时,请求会切换到指定节点,保证会话可用;

  5. requestUriIgnorePattern:忽略静态资源的 Session 交互,减少 Memcached 开销,提升访问速度。

四、实验三:Nginx 与 Tomcat 整合(实现负载均衡)

1. 实验背景

单台 Tomcat 服务器的并发处理能力有限,当访问量激增时,会出现响应缓慢、服务宕机等问题。

Nginx 是高性能的 HTTP 反向代理服务器,将用户请求分发到多台 Tomcat 节点,实现负载均衡,提升整个 Web 服务的并发处理能力;同时 Nginx 擅长处理静态资源,可与 Tomcat 分工,Tomcat 仅处理动态的 JSP/Servlet 请求,进一步提升服务性能。

2. 实验环境

  • Nginx 服务器:独立节点,已完成 Nginx 安装;

  • 两台 Tomcat 服务器:RS1(<172.25.254.10>)、RS2(<172.25.254.20>),已完成 +Memcached 配置;

  • 测试文件:test.jsp(用于验证动态请求转发);

  • 客户端:Windows 主机(用于浏览器访问测试);

  • 域名:app.brs.org(用于虚拟主机配置)。

3. 实验目的

  • 掌握 Nginx 反向代理 Tomcat 的基础配置;

  • 学会 Nginx upstream 模块实现多 Tomcat 节点负载均衡;

  • 配置会话粘滞,保证同一用户的请求分发到同一 Tomcat 节点;

  • 实现 Nginx 处理静态资源、Tomcat 处理动态资源的分工。

4. 详细操作步骤

步骤 1:部署测试 JSP 文件到所有 Tomcat 节点

test.jsp 复制到两台 Tomcat 的 webapps/ROOT 目录,确保所有节点均可处理该动态请求:

Bash 复制代码
[root@RS1 ~]# cp test.jsp  /usr/local/tomcat/webapps/ROOT/
[root@RS1 ~]# scp test.jsp  root@172.25.254.20:/usr/local/tomcat/webapps/ROOT/
步骤 2:Nginx 单体架构配置(代理单台 Tomcat)

先实现 Nginx 代理单台 Tomcat,验证反向代理功能,操作在 Nginx 服务器执行:

  1. 进入 Nginx 虚拟主机配置目录:

    Bash 复制代码
    [root@Nginx conf.d]# cd /usr/local/nginx/conf/conf.d/
  2. 创建/编辑虚拟主机配置文件 vhosts.conf

    Bash 复制代码
    [root@Nginx conf.d]# vim vhosts.conf
    # 写入以下配置
    server {
        listen 80;
        server_name app.brs.org;
        # 匹配所有 .jsp 动态请求,代理到 RS1 的 Tomcat
        location ~* \.jsp$ {
            proxy_pass http://172.25.254.10:8080;
        }
    }
  3. 重载 Nginx 配置,使配置生效:

    Bash 复制代码
    [root@Nginx conf.d]# nginx  -s reload
  4. 客户端测试:在 Windows 主机修改 hosts 文件(C:\Windows\System32\drivers\etc\hosts),添加域名解析:

    Plain 复制代码
    172.25.254.3 app.brs.org

    打开浏览器访问 http://app.brs.org/test.jsp,能正常显示页面即表示反向代理成功。

步骤 3:Nginx 负载均衡配置(代理多台 Tomcat)

修改 Nginx 配置,通过 upstream 模块定义 Tomcat 集群,实现请求分发,操作在 Nginx 服务器执行:

  1. 编辑 vhosts.conf,添加负载均衡集群配置:

    Bash 复制代码
    [root@Nginx conf.d]# vim vhosts.conf
    # 定义 Tomcat 负载均衡集群,命名为 tomcat
    upstream tomcat {
        hash $cookie_JSESSIONID;  # 基于 JSESSIONID 实现会话粘滞
        server 172.25.254.10:8080;  # Tomcat 节点 1
        server 172.25.254.20:8080;  # Tomcat 节点 2
    }
    server {
        listen  80;
        server_name app.brs.org;
        # 动态请求代理到 tomcat 集群
        location ~* \.jsp$ {
            proxy_pass http://tomcat;  # 此处改为集群名,而非单个 IP
        }
    }
  2. 重载 Nginx 配置:

    Bash 复制代码
    [root@Nginx conf.d]# nginx  -s reload
  3. 客户端测试:

    • 打开 Windows 浏览器访问 http://app.brs.org/test.jsp

    • 更换浏览器/清空缓存后再次访问,验证请求被分发到不同 Tomcat 节点;

    • 同一浏览器多次刷新,验证会话粘滞(请求始终分发到同一节点)。

5. 实验截图

6. 核心知识点总结

  1. Nginx 作为反向代理,可隐藏后端 Tomcat 节点的真实 IP,提升服务器安全性;

  2. upstream 是 Nginx 实现负载均衡的核心模块,可定义多个后端服务节点;

  3. hash $cookie_JSESSIONID:基于用户的 JSESSIONID 实现会话粘滞,保证同一用户的请求始终分发到同一 Tomcat 节点,避免会话问题;

  4. Nginx 负载均衡常用策略:轮询(默认)、权重、IP 哈希、url 哈希等,可根据业务场景选择;

  5. 性能优化核心:让 Nginx 处理静态资源(html、css、img、js),Tomcat 仅处理动态 JSP/Servlet 请求,充分发挥两者的优势。

五、整体知识点总结

  1. Tomcat 是 Java Web 开发的基础容器,部署前必须先配置 JDK 环境,推荐将 Tomcat 配置为系统服务实现开机自启;

  2. Tomcat 核心配置文件集中在 conf 目录,server.xml 配置端口、context.xml 配置全局上下文、web.xml 配置 Web 应用;

  3. 多 Tomcat 集群的核心问题是 Session 共享,结合 Memcached 可实现 Session 集中存储,达到会话零丢失的效果;

  4. Nginx + Tomcat 是企业级 Java Web 应用的经典架构,Nginx 实现负载均衡和静态资源处理,Tomcat 实现动态请求处理,大幅提升服务并发能力;

  5. 生产环境优化要点:

    • 为 Tomcat 创建专用运行用户,禁止 root 运行;

    • 配置 Tomcat 内存参数,提升运行性能;

    • 开启 Nginx 缓存,减少后端 Tomcat 压力;

    • 配置 Tomcat 和 Nginx 的日志切割,方便故障排查。

相关推荐
wangbing11252 小时前
开发指南143-扩展类功能
java·开发语言
何中应2 小时前
从零搭建Maven私服(Nexus)
java·运维·maven
loserwang2 小时前
拆解 NIO 核心:脱离 Selector 视角,详解 Channel、Buffer 与 Netty 的进阶优化
java
zihan03212 小时前
若依(RuoYi)框架升级适配 JDK 21 和 SpringBoot 3.5.10
java·spring boot·spring·若依·若依升级jdk21
cyber_两只龙宝2 小时前
Tomcat--企业级web应用服务器详细介绍与整合Nginx配置流程
linux·运维·前端·nginx·云原生·tomcat·负载均衡
Drifter_yh2 小时前
「JVM」 并发编程基石:Java 内存模型(JMM)与 Synchronized 锁升级原理
java·开发语言·jvm
Seven972 小时前
CompletableFuture深度解析:异步编程与任务编排的实现
java
kyrie学java2 小时前
SpringBoot搭建项目调试与问题解决
java·spring boot·后端
SimonKing2 小时前
多数据源:CSV、内存对象可以通过SQL查询,甚至联查,你敢信!
java·后端·程序员