目录
什么是Tomcat?
Tomcat 是一款广泛使用的 开源 Java Web 服务器和 Servlet 容器,主要用于运行 Java 编写的 Web 应用程序。它由 Apache 软件基金会开发并维护,因轻量、稳定、易用等特点,成为 Java Web 开发领域的主流工具之一。
Tomcat 的核心功能
-
Servlet 容器
Servlet 是 Java 用于处理 Web 请求的组件,Tomcat 提供了 Servlet 的运行环境,能够接收客户端(如浏览器)的 HTTP 请求,调用对应的 Servlet 进行处理,并将结果返回给客户端。
-
JSP 容器
JSP(Java Server Pages)是一种嵌入 Java 代码的网页技术,Tomcat 可以将 JSP 文件编译为 Servlet 并执行,实现动态网页内容的生成。
-
HTTP 服务器
虽然 Tomcat 主要作为容器,但它也内置了简单的 HTTP 服务器功能,能够直接处理静态资源(如 HTML、CSS、图片等)的请求,无需依赖其他 Web 服务器(如 Nginx、Apache HTTP Server)。不过在生产环境中,常将 Tomcat 与 Nginx 配合使用(Nginx 处理静态资源和反向代理,Tomcat 处理动态请求),以提高性能和安全性。
Tomcat 的应用场景
-
开发环境:Java 开发者在本地调试 Web 应用时,常用 Tomcat 作为服务器。
-
中小型 Web 应用部署:对于访问量不大的企业网站、内部系统等,Tomcat 可直接作为独立服务器运行。
-
集群部署:通过负载均衡(如 Nginx 反向代理)将多台 Tomcat 组成集群,提高大型应用的并发处理能力和可用性。
本次讨论的就是tomcat与nginx结合作为集群部署中的服务器,处理动态资源。
安装Tomcat
1.安装java环境
bash
#安装java
[root@tomcatA bin]# dnf install java-1.8.0-openjdk.x86_64 -y
#查看java版本
[root@tomcatB bin]# java -version
2.安装并启动tomcat
bash
[root@tomcatA ~]# tar zxf apache-tomcat-9.0.107.tar.gz
[root@tomcatA ~]# mv apache-tomcat-9.0.107.tar.gz /usr/local/tomcat
#查看tomcat相关目录和文件
[root@tomcatA tomcat]# ls
bin conf lib logs README.md RUNNING.txt webapps
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE RELEASE-NOTES temp work
[root@tomcatA tomcat]# cd /usr/local/tomcat/bin/
#启动tomcat
[root@tomcatA bin]# ./startup.sh
[root@tomcatA bin]# netstat -antlupe | grep java
tcp6 0 0 :::8080 :::* LISTEN 1001 85735 35805/java
#关闭tomcat
[root@tomcatA bin]# ./shutdown.sh
目录结构
目录 说明
bin 服务启动、停止等相关程序和文件
conf 配置文件
lib 库目录
logs 日志目录
webapps 应用程序,应用部署目录,相当于nginx的默认发布目录
work jsp 编译后的结果文件,建议提前预热访问
4.访问tomcat默认发布文件

生成启动文件
1.生成tomat的主配置文件
bash
[root@tomcatA bin]# vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/etc/alternatives/jre/
#如何去寻找JAVA_HOME参数
[root@tomcatA ~]# which java
/usr/bin/java
[root@tomcatA ~]# ll /usr/bin/java
lrwxrwxrwx 1 root root 22 Jul 30 10:54 /usr/bin/java -> /etc/alternatives/java
[root@tomcatA ~]# ll /etc/alternatives/jre
2.生成启动文件
bash
[root@tomcatA ~]# 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
3.创建tomcat用户去管理启动文件
bash
#创建非交互且不创建家目录的用户去管理启动文件
[root@tomcatA ~]# useradd -s /sbin/nologin -M tomcat
#设定tomcat的软件安装目录权限
[root@tomcatA ~]# chown tomcat:tomcat /usr/local/tomcat/ -R
4.用启动脚本开始服务
bash
[root@tomcatA ~]# systemctl daemon-reload
[root@tomcatA ~]# systemctl enable --now tomcat
nginx反向代理tomcat
1.tomcat常见部署方式
在生产环境中,常将 Tomcat 与 Nginx 配合使用(Nginx 处理静态资源和反向代理,Tomcat 处理动态请求),以提高性能和安全性。以下是tomcat常用的部署方式。

2.单机反向代理
不做负载均衡只做反向代理
1.安装nginx
bash
#安装nginx并启动
[root@webserver ~]# dnf install nginx -y
[root@webserver ~]# systemctl enable --now nginx
2.在tomcat上生成测试文件
bash
[root@tomcatA ~]# mv test.jsp /usr/local/tomcat/webapps/ROOT/
3.配置nginx实现反向代理
bash
#编辑子配置文件,使用location + 正则表达式来指向访问jsp结尾的文件,proxy_pass代理指向到tomcat上
[root@webserver ~]# vim /etc/nginx/conf.d/vhosts.conf
[root@webserver ~]# nginx -t
[root@webserver ~]# nginx -s reload

4.在浏览器上测试

3.反向代理多机
反向代理+负载均衡
1.后端两台tomcat主机都要生成测试文件
bash
[root@tomcatA ~]# mv test.jsp /usr/local/tomcat/webapps/ROOT/
[root@tomcatB ~]# mv test.jsp /usr/local/tomcat/webapps/ROOT/
2.在nginx子配置文件添加upstream模块实现负载均衡
bash
[root@tomcatA ~]# vim /usr/local/tomcat/conf/tomcat.conf

3.测试
tomcat的session保持
1.Memcached
Memcached 是一款高性能的分布式内存对象缓存系统,主要用于减轻数据库负载、提高动态 Web 应用的响应速度。它通过将频繁访问的数据存储在内存中,让应用可以快速读取,避免频繁查询数据库,从而提升整体性能。
Memcached 的核心特点
-
内存存储
数据完全存储在内存中,读写速度远快于磁盘(数据库通常依赖磁盘存储),适合缓存频繁访问的 "热点数据"(如用户会话、商品信息、查询结果等)。
-
分布式架构
支持多服务器部署,通过哈希算法将数据分散到不同节点,实现负载均衡和横向扩展,避免单节点瓶颈。
-
简单键值存储
以 键(Key)- 值(Value) 形式存储数据,键最大为 250 字节,值默认最大为 1MB(可配置),不支持复杂数据结构(如关系型数据库的表、索引)。
-
过期策略
每个键值对可设置过期时间(TTL,Time-To-Live),过期后自动删除,释放内存空间;当内存不足时,采用 LRU(最近最少使用) 算法淘汰旧数据。
-
无持久化
数据仅存于内存,不写入磁盘,服务器重启后数据会丢失,因此不适合存储需要持久化的数据(通常与数据库配合使用,作为 "缓存层")。
-
轻量级协议
使用简单的文本协议(如 set get delete 等命令),支持多种编程语言(Java、Python、PHP、Go 等)的客户端。
Memcached 的工作流程
-
应用需要读取数据时,先查询 Memcached:
1.若数据存在(缓存命中),直接从内存返回,速度极快。
2.若数据不存在(缓存未命中),则查询数据库,将结果写入 Memcached 后返回给应用(下次可直接从缓存读取)。
-
当数据更新时,需同步更新或删除 Memcached 中的旧数据,避免 "缓存不一致" 问题。
2.msm介绍
msm(memcached session manager)提供将Tomcat的session临时缓存保持到memcached实现高可用,避免提交数据时tomcat服务器宕机,导致提交过的数据丢失。
tomcat通过把配置jar包放入配置文件的lib目录下读取,实现访问memcached,达到seeion保持。
原理是提交数据时将数据临时缓存到memcached中,tomcat服务器读取memcached的缓存数据,默认使用交叉存储。

3.实现session保持
1.下载memcache并更改监听IP
bash
[root@tomcatA ~]# dnf install memcache -y
[root@tomcatA ~]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1" #更改监听IP为0.0.0.0使所有主机都能访问memcache缓存键值
#更改完配置文件后重启memcache
[root@tomcatA ~]# systemctl restart memcached.service
#同理另一台tomcat主机也是这样配置
2.配置jar包
配置的jar包是管理tomcat服务器与memcache会话保持的jar包,方式为交叉管理
bash
#这是从Github托管tomcat会话保持到memcache的交叉管理的jar包
[root@tomcatA jar]# ls
asm-5.2.jar memcached-session-manager-2.3.2.jar msm-kryo-serializer-2.3.2.jar spymemcached-2.12.3.jar
kryo-3.0.3.jar memcached-session-manager-tc9-2.3.2.jar objenesis-2.6.jar
kryo-serializers-0.45.jar minlog-1.3.1.jar reflectasm-1.11.9.jar
#将管理jar包放入tomcat的lib/目录
[root@tomcatA ~]# mv jar/* /usr/local/tomcat/lib/
#重启tomcat读取配置
[root@tomcatA lib]# systemctl restart tomcat.service
3.修改tomcat配置文件
bash
[root@tomcatB ~]# vim /usr/local/tomcat/conf/context.xml
<Context>
......
<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>
#同理在另一台tomcat上也要配置

4.测试提交表单时,后端tomcat主机发生宕机轮询到另一台tomcat保证提交表单数据不丢失

bash
#模拟故障宕机
[root@tomcatA ~]# systemctl stop tomcat.service

当配置了memcache缓存后

bash
#模拟故障宕机
[root@tomcatA ~]# systemctl stop tomcat.service
