目录
什么是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环境
#安装java
[root@tomcatA bin]# dnf install java-1.8.0-openjdk.x86_64 -y
#查看java版本
[root@tomcatB bin]# java -version
2.安装并启动tomcat
[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的主配置文件
[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.生成启动文件
[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用户去管理启动文件
#创建非交互且不创建家目录的用户去管理启动文件
[root@tomcatA ~]# useradd -s /sbin/nologin -M tomcat
#设定tomcat的软件安装目录权限
[root@tomcatA ~]# chown tomcat:tomcat /usr/local/tomcat/ -R
4.用启动脚本开始服务
[root@tomcatA ~]# systemctl daemon-reload
[root@tomcatA ~]# systemctl enable --now tomcat
nginx反向代理tomcat
1.tomcat常见部署方式
在生产环境中,常将 Tomcat 与 Nginx 配合使用(Nginx 处理静态资源和反向代理,Tomcat 处理动态请求),以提高性能和安全性。以下是tomcat常用的部署方式。
2.单机反向代理
不做负载均衡只做反向代理
1.安装nginx
#安装nginx并启动
[root@webserver ~]# dnf install nginx -y
[root@webserver ~]# systemctl enable --now nginx
2.在tomcat上生成测试文件
[root@tomcatA ~]# mv test.jsp /usr/local/tomcat/webapps/ROOT/
3.配置nginx实现反向代理
#编辑子配置文件,使用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主机都要生成测试文件
[root@tomcatA ~]# mv test.jsp /usr/local/tomcat/webapps/ROOT/
[root@tomcatB ~]# mv test.jsp /usr/local/tomcat/webapps/ROOT/
2.在nginx子配置文件添加upstream模块实现负载均衡
[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
[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包,方式为交叉管理
#这是从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配置文件
[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保证提交表单数据不丢失
#模拟故障宕机
[root@tomcatA ~]# systemctl stop tomcat.service
当配置了memcache缓存后
#模拟故障宕机
[root@tomcatA ~]# systemctl stop tomcat.service