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.xml、context.xml、web.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 开机自启、便捷的启停管理,步骤如下:
-
创建 Tomcat 环境配置文件,指定 JAVA_HOME 路径:
Bashvim /usr/local/tomcat/conf/tomcat.conf # 写入以下内容并保存 JAVA_HOME=/etc/alternatives/jre -
创建 systemd 服务文件
/lib/systemd/system/tomcat.service:Bashvim /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 -
创建 Tomcat 专用用户(避免 root 运行,提升服务器安全性):
Bash# 创建无登录权限的 tomcat 用户和用户组 useradd -s /sbin/nologin -M tomcat # 为 tomcat 用户授权 Tomcat 整个目录 chown tomcat.tomcat /usr/local/tomcat/ -R -
重载系统服务并设置 Tomcat 开机自启,验证服务状态:
Bash# 重载 systemd 配置,使新服务生效 systemctl daemon-reload # 启动 Tomcat 并设置开机自启 systemctl enable --now tomcat # 验证 Tomcat 相关端口监听 netstat -antlupe | grep java
服务配置成功标识 :netstat 命令输出 8080(服务端口)和 8005(管理端口)的 LISTEN 状态。
4. 实验截图

5. 核心知识点总结
-
Tomcat 运行强依赖 JDK,必须保证
JAVA_HOME路径配置正确,否则无法启动; -
./startup.sh/./shutdown.sh是临时启停脚本,关闭终端或服务器重启后 Tomcat 会停止; -
为 Tomcat 创建专用运行用户,禁止使用 root 用户运行,可有效降低服务器安全风险;
-
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 部署和可远程访问配置:
-
安装 Memcached:
Bashdnf install memcached -y -
修改 Memcached 配置文件,允许所有地址访问:
Bashvim /etc/sysconfig/memcached # 确保配置内容如下 PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="-l 0.0.0.0,::1" -
启动 Memcached 并验证端口监听:
Bashsystemctl 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 ** 不同。
-
配置 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> -
配置 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> -
重启两台服务器的 Tomcat,使配置生效:
Bashsystemctl restart tomcat.service
5. 实验截图


6. 核心知识点总结
-
Memcached 是内存型缓存,适合存储临时的 Session 会话数据,读写速度远高于磁盘;
-
MemcachedBackupSessionManager是 Tomcat 的第三方会话管理扩展,实现将 Session 写入 Memcached; -
memcachedNodes:配置 Memcached 节点列表,格式为节点名:IP:端口; -
failoverNodes:配置故障切换节点,当前节点故障时,请求会切换到指定节点,保证会话可用; -
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 服务器执行:
-
进入 Nginx 虚拟主机配置目录:
Bash[root@Nginx conf.d]# cd /usr/local/nginx/conf/conf.d/ -
创建/编辑虚拟主机配置文件
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; } } -
重载 Nginx 配置,使配置生效:
Bash[root@Nginx conf.d]# nginx -s reload -
客户端测试:在 Windows 主机修改
hosts文件(C:\Windows\System32\drivers\etc\hosts),添加域名解析:Plain172.25.254.3 app.brs.org打开浏览器访问
http://app.brs.org/test.jsp,能正常显示页面即表示反向代理成功。
步骤 3:Nginx 负载均衡配置(代理多台 Tomcat)
修改 Nginx 配置,通过 upstream 模块定义 Tomcat 集群,实现请求分发,操作在 Nginx 服务器执行:
-
编辑
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 } } -
重载 Nginx 配置:
Bash[root@Nginx conf.d]# nginx -s reload -
客户端测试:
-
打开 Windows 浏览器访问
http://app.brs.org/test.jsp; -
更换浏览器/清空缓存后再次访问,验证请求被分发到不同 Tomcat 节点;
-
同一浏览器多次刷新,验证会话粘滞(请求始终分发到同一节点)。
-
5. 实验截图

6. 核心知识点总结
-
Nginx 作为反向代理,可隐藏后端 Tomcat 节点的真实 IP,提升服务器安全性;
-
upstream是 Nginx 实现负载均衡的核心模块,可定义多个后端服务节点; -
hash $cookie_JSESSIONID:基于用户的 JSESSIONID 实现会话粘滞,保证同一用户的请求始终分发到同一 Tomcat 节点,避免会话问题; -
Nginx 负载均衡常用策略:轮询(默认)、权重、IP 哈希、url 哈希等,可根据业务场景选择;
-
性能优化核心:让 Nginx 处理静态资源(html、css、img、js),Tomcat 仅处理动态 JSP/Servlet 请求,充分发挥两者的优势。
五、整体知识点总结
-
Tomcat 是 Java Web 开发的基础容器,部署前必须先配置 JDK 环境,推荐将 Tomcat 配置为系统服务实现开机自启;
-
Tomcat 核心配置文件集中在
conf目录,server.xml配置端口、context.xml配置全局上下文、web.xml配置 Web 应用; -
多 Tomcat 集群的核心问题是 Session 共享,结合 Memcached 可实现 Session 集中存储,达到会话零丢失的效果;
-
Nginx + Tomcat 是企业级 Java Web 应用的经典架构,Nginx 实现负载均衡和静态资源处理,Tomcat 实现动态请求处理,大幅提升服务并发能力;
-
生产环境优化要点:
-
为 Tomcat 创建专用运行用户,禁止 root 运行;
-
配置 Tomcat 内存参数,提升运行性能;
-
开启 Nginx 缓存,减少后端 Tomcat 压力;
-
配置 Tomcat 和 Nginx 的日志切割,方便故障排查。
-