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 的日志切割,方便故障排查。

相关推荐
代码雕刻家13 小时前
3.5.Maven-依赖管理-依赖配置&依赖传递
java·maven
!chen13 小时前
MyBatis-plus拓展之字段类型处理器、自动填充和乐观锁
java·tomcat·mybatis
Jin、yz14 小时前
JAVA 八股
java·开发语言
va学弟14 小时前
Java 网络通信编程(6):视频通话
java·服务器·网络·音视频
pjw1988090314 小时前
Spring Framework 中文官方文档
java·后端·spring
jgyzl14 小时前
2026.3.11MyBatis-Plus基本使用与思考
java·数据库·mybatis
Full Stack Developme15 小时前
Java 常用通信协议及对应的框架
java·开发语言
( •̀∀•́ )92015 小时前
Spring Boot 启动报错 `BindException: Permission denied`
java·spring boot·后端
杰克尼15 小时前
苍穹外卖--day10
java·数据库·spring boot·mybatis·notepad++
sjmaysee15 小时前
Windows操作系统部署Tomcat详细讲解
java·windows·tomcat