一、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 交互场景:
客户端(浏览器)发送 HTTP 请求,访问 Tomcat 的 8080 端口,被 Connector 连接器接收; Connector 解析 HTTP 协议,将请求封装为 Servlet 规范的 Request 对象,传递给 Engine 引擎; Engine 根据请求的域名/IP,匹配对应的 Host 虚拟主机; Host 根据请求的 URI 路径,匹配对应的 Context(目标 Web 应用); Context 根据请求路径,匹配对应的 Wrapper(目标 Servlet); Wrapper 调用 Servlet 的 service() 方法,执行业务逻辑,生成 Response 响应对象; 响应结果沿原路径逐级返回,由 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