一、Tomcat 核心理论知识

Tomcat 是 Apache 开源的轻量级 Java Web 应用服务器,也是 Java Web 开发中最常用的 Servlet 容器,核心作用是运行 Java 动态 Web 程序(Servlet、JSP 等),同时支持静态资源(HTML、CSS、JS 等)的处理,是连接客户端请求与 Java 业务逻辑的核心中间件。

1 Tomcat 核心定位与Web场景适配

在 Web 架构中,Tomcat 属于「动态 Web 服务器」,与静态 Web 服务器(如 Nginx、Apache)分工明确:

  • 静态 Web 服务器:仅处理静态资源,无法执行 Java 代码,优势是高并发、轻量;
  • Tomcat:核心能力是解析并执行 Java 动态代码(Servlet/JSP),同时可兼容处理静态资源,适合中小型 Web 项目;
  • 生产场景:常与 Nginx 搭配使用,实现「动静分离」——Nginx 处理静态资源和反向代理,Tomcat 专注处理动态请求,提升 Web 服务的性能和稳定性。

2 Tomcat 核心组件架构(Web 视角)

Tomcat 采用组件化分层设计,核心是「连接器(Connector)+ 容器(Container)」,自上而下适配 Web 请求的路由与处理,核心组件如下(从顶层到底层):

  • Server(服务器):Tomcat 的顶层实例,一个 JVM 进程对应一个 Server,负责管理所有 Service 服务,是 Tomcat 启动的入口。

  • Service(服务):一个 Service 对应一组「连接器+容器」,负责将客户端请求传递给容器处理,一个 Server 可包含多个 Service(极少用)。

  • Connector(连接器):Web 请求的“接收者”,监听指定端口(默认 HTTP 端口 8080),接收客户端(浏览器)的 HTTP 请求,解析请求协议,将请求封装为标准的 Servlet 请求对象,传递给容器;同时将容器的响应结果封装为 HTTP 报文,返回给客户端。

  • Container(容器):Web 业务的“处理器”,负责执行 Java 动态代码,核心是 4 层嵌套容器,实现请求的逐级路由:

    • Engine(引擎):容器顶层,管理多个虚拟主机,负责请求的全局路由;

    • Host(虚拟主机):对应一个 Web 域名(如 localhost),一个 Host 可部署多个 Web 应用,实现单 Tomcat 部署多站点;

    • Context(Web 应用上下文):对应一个独立的 Java Web 项目,拥有独立的资源和类加载器,实现不同 Web 应用的资源隔离;

    • Wrapper(Servlet 封装器):容器最小单元,封装单个 Servlet,负责 Servlet 的全生命周期管理(实例化、初始化、执行、销毁)。

3 Java Web 应用标准目录结构(适配 Tomcat 部署)

Tomcat 严格遵循 Java EE 规范,Web 应用必须采用标准目录结构,否则无法正常部署,核心结构如下(Web 应用根目录下):

1
2
3
4
5
6
Web应用根目录/
├── 静态资源(HTML、CSS、JS、图片等,可直接被浏览器访问)
└── WEB-INF/ (受保护目录,外部无法直接访问,核心配置与代码存放)
├── web.xml # Web应用部署描述符,配置Servlet、过滤器、欢迎页等
├── classes/ # 编译后的Java字节码文件(.class)
└── lib/ # Web应用依赖的第三方Jar包(如MySQL驱动)

4 Web 请求在 Tomcat 中的完整处理流程

以浏览器发起 HTTP 请求为例,Tomcat 的处理流程简洁清晰,贴合 Web 交互场景:

  1. 客户端(浏览器)发送 HTTP 请求,访问 Tomcat 的 8080 端口,被 Connector 连接器接收;
  2. Connector 解析 HTTP 协议,将请求封装为 Servlet 规范的 Request 对象,传递给 Engine 引擎;
  3. Engine 根据请求的域名/IP,匹配对应的 Host 虚拟主机;
  4. Host 根据请求的 URI 路径,匹配对应的 Context(目标 Web 应用);
  5. Context 根据请求路径,匹配对应的 Wrapper(目标 Servlet);
  6. Wrapper 调用 Servlet 的 service() 方法,执行业务逻辑,生成 Response 响应对象;
  7. 响应结果沿原路径逐级返回,由 Connector 封装为 HTTP 响应报文,返回给客户端,浏览器渲染展示。

5 Tomcat 核心配置文件(Web 部署必备)

Tomcat 的核心配置文件均存放在安装目录的 conf 文件夹中,Web 开发/部署常用的 4 个核心文件:

  • server.xml:Tomcat 全局核心配置,可修改端口号、配置虚拟主机、调整连接器参数(如最大连接数);
  • web.xml:Tomcat 全局默认配置,所有 Web 应用都会继承该配置,包含默认欢迎页、MIME 类型映射等;
  • tomcat-users.xml:用户权限配置,用于 Tomcat 管理控制台(部署、管理 Web 应用)的登录权限控制;
  • context.xml:全局上下文配置,所有 Web 应用的通用规则,如配置数据源(连接数据库)。

6 核心特性(Web 开发常用)

  • 类加载隔离:每个 Web 应用拥有独立的类加载器,避免不同项目的 Jar 包冲突;
  • 热部署/热加载:修改 Web 应用代码或配置后,无需重启 Tomcat,即可生效(开发环境常用);
  • 虚拟主机:单 Tomcat 实例可部署多个 Web 站点(不同域名),节省服务器资源;
  • 安全支持:支持 HTTPS 配置、用户权限管控,保障 Web 应用的安全性。

二、Tomcat 与 Session 会话保持

1 Tomcat 基础安装部署

1.1 下载 Tomcat 官方安装包

1
[root@RS1 ~]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.115/bin/apache-tomcat-9.0.115.tar.gz

1.2 Tomcat 服务部署与基础环境校验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@RS1 local]# yum install java-1.8.0-openjdk.x86_64 -y
[root@RS1 ~]# tar zxf apache-tomcat-9.0.115.tar.gz -C /usr/local
[root@RS1 ~]# cd /usr/local/
[root@RS1 local]# ls
bin etc games include lib lib64 libexec sbin share src tomcat-9.0-doc
[root@RS1 local]# mv apache-tomcat-9.0.115/ tomcat
[root@RS1 local]# cd tomcat/
[root@RS1 tomcat]# ls
bin conf lib logs README.md RUNNING.txt webapps
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE RELEASE-NOTES temp work



[root@RS1 bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
[root@RS1 bin]# netstat -antlupe | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 0 139291 10372/java

1.3 制作 Tomcat 系统开机自启脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@RS1 bin]# vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/etc/alternatives/jre
[root@RS1 bin]# vim /lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
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

[root@RS1 bin]# useradd -s /sbin/nologin -M tomcat

[root@RS1 bin]# chown tomcat.tomcat /usr/local/tomcat/ -R
[root@RS1 bin]# systemctl daemon-reload
[root@RS1 bin]# systemctl enable --now tomcat
[root@RS1 bin]# netstat -antlupe | grep java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 1000 139979 10682/java
tcp6 0 0 :::8080 :::* LISTEN 1000 140563 10682/java

2 Tomcat+Memcache 实现 Session 会话零丢失

2.1 前置准备:Tomcat 会话共享依赖模块加载

1
2
3
4
[root@RS1 ~]# unzip jar.zip
[root@RS1 ~]# cd jar/
[root@RS1 jar]# cp * /usr/local/tomcat/
[root@RS1 jar]# scp * root@172.25.254.20:/usr/local/tomcat/lib/

2.2 Memcache 服务安装、启动与基础配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@RS1 jar]# dnf install memcached
[root@RS2 ~]# dnf install memcached -y

[root@RS1 ~]# vim /etc/sysconfig/memcached
[root@RS2 ~]# vim /etc/sysconfig/memcached

PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"

[root@RS1+2 ~]# netstat -antluple | grep memcached
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 988 142615 35756/memcached
tcp6 0 0 ::1:11211 :::* LISTEN 988 142616 35756/memcached

2.3 Tomcat 端 Session 共享规则配置与验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[root@RS1 ]#  vim /usr/local/tomcat/conf/context.xml

<Context>

<!-- Default set of monitored resources. If one of these changes, the -->
<!-- web application will be reloaded. -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<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>

[root@RS2 ]# vim /usr/local/tomcat/conf/context.xml

<Context>

<!-- Default set of monitored resources. If one of these changes, the -->
<!-- web application will be reloaded. -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>

</Context>
[root@RS1 ~]# systemctl restart tomcat.service
[root@RS2 ~]# systemctl restart tomcat.service