1.动静分离-单台节点
1.1接入nginx
1)webapps下特殊的ROOT目录

2)lnmt(tomcat)
3)精确控制修改权限
- (ngx处理用户请求是nginx虚拟用户,而下方目录/文件其他人位置没有读取权限)
# chmod -R 755 /app/tools/tomcat 这样修改不安全,文件也会是755(加了执行权限)
find /app/tools/tomcat/webapps/ -type f |xargs chmod 644 #文件权限644
find /app/tools/tomcat/webapps/ -type d |xargs chmod 755 #目录权限755

4)数据库链接

1.2集群模式(7)
- 全流程准备
- db,nfs01
- web03,web04(jdk+tomcat+zrlog(ROOT ROOT.war))
- lb01,lb02
- keepalived
- 测试
- war包本质是压缩包
.zip
2.tomcat配置与使用
2.1tomcat配置文件
1. <Server port="8005" shutdown="SHUTDOWN">
tomcat 关闭端口,telnet连接127.0.0.1 8005,输入SHUTDOWN,tomcat关闭了(没端口,有进程(先pkill掉,再启动))。8005默认本地连接
2. <Listener....>
加载的一些插件
3.Service部分中的<connector> http区域
<Connector port="8080" protocol="HTTP/1.1" #协议版本
connectionTimeout="20000" #超时时间-毫秒
redirectPort="8443" #tomcat配置https
maxParameterCount="1000"
/>
4. <Engine name="Catalina" defaultHost="localhost"> defaultHost类似于ngx中defalut_server指定默认站点
defaultHost="localhost" 域名(在Host区域)
5. <Host></Host>部分 类似于ngx中server{}部分 一个站点.
| tomcat与nginx对比 | tomcat | nginx |
| web端口 | Connector=8080 | listen 80/443 |
| 站点/虚拟主机 | <Host></Host>部分 | server{}部分 |
| 域名 | name=”localhost” | server_name |
| 站点目录(相对于Tomcat目录) | appBase=”webapps” | root |
| 自动解压(war包解压目录) zip压缩包 | unpackWARs=”true” | 无 |
| 自动部署(解压后加载到jvm中) | autoDeploy=”true” | 无 |
2.2配置tomcat访问日志格式
| 说明 | tomcat | nginx |
| 定义访问日志的格式 | Host部分的pattern定义 | http区域log_format部分 |
| 客户端ip地址 | %h | $remote_addr |
| 访问的时间 | %t | $local_time |
| 请求起始行(请求方法,URI,HTTP) | %r | $request |
| 状态码 | %s | $status |
| 大小 | %b | $body_bytes_sent |
| 从哪里跳转来的(用户如何访问网站) | %{Referer}i 新增 | $http_referer |
| 客户端类型,浏览器 | %{User-Agent}i 新增 | $http_user_agent |
| XFF头记录 | %{X-Forwarded-For}i 新增 | $http_x_forwarded_for |
" 双引号
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
#未来开头写站点域名 .log结尾
prefix="localhost_access" suffix=".log"
pattern="%h %l %u %t "%r" %s %b "%{Referer}i"
"%{User-Agent}i" "%{X-Forwarded-For}i"" />
3.tomcat处理用户请求流程
3.1请求入口
- 请求入口:Connector(对应nginx的listen端口)
- 配置文件位置:
<Connector>标签定义在server.xml文件的<Service>内。 - 功能:
- 监听指定端口(如 80/443)和协议(HTTP/1.1 AJP HTTP/2)
- 接收客户端请求,处理协议解析(如HTTP报文解析)
- 支持SSL配置(通过
SSLEnabled和keystoreFile等参数) - 与nginx对比
- 类似ngx的
listen 80或listen 443 ssl配置 - 一个
<Service>可以包含多个<Connector>,类似ngx的多个server监听不同端口 
3.2请求分发
- 请求分发:Engine(对应nginx的http全局区域)
- 配置文件位置:
<Engine>标签定义在<Service>内,包裹在<Connector>之后 - 功能
- 作为请求处理的全局容器,管理多个虚拟主机(
<Host>) - 通过
defaultHost属性指定默认虚拟主机(类似nginx的default_server) - 与nginx对比
- 类似于ngx的http{…}块, 是所有站点配置的入口
- 内容:
<Engine name="Catalina" defaultHost="localhost">
3.3虚拟主机匹配
- 虚拟主机匹配:
Host(对应nginx的server块)
- 配置文件位置:
<Host>标签定义在<Engine>内。 - 功能:
- 根据域名(
name属性) 匹配请求的Host头 - 管理多个Web应用(
<Context>),每个应用对应一个URL路径 - nginx对比
- 类似于ngx的
server{listen 80; server_name example.com; ...} name属性对应ngx的server_name
3.4应用路径匹配
- 应用路径匹配:Context(对应nginx的location规则)
- 配置文件位置:
<Context>标签可以定义在<Host>内,或通过web.xml隐式配置。 - 功能
- 通过
path属性匹配URL路径,将请求路由到具体的Web应用 - 指定应用资源路径(
docBase属性,类似ngx的root或alias) - nginx对比
- 类似于ngx的
location /app {...} - 默认的ROOT应用对应
path="",处理根路径请求。 
3.5请求处理链
- 请求处理链:
Valve(类似于nginx的中间件模块)
- 配置文件位置:
<Valve>标签可以定义在<Engine>、<Host>或<Context>内。 - 功能
- 实现请求处理链的扩展逻辑(如日志记录,ip过滤,权限控制)
- 支持自定义
Valve组件 - nginx对比
- 类似于ngx的
access_log或auth_request模块。 
3.6完整请求处理流程
1.连接建立
- 用户通过浏览器访问,请求到达tomcat的Connector(监听8080端口)
2.协议处理
- Connector解析HTTP协议,生成Request和Response对象
3.虚拟主机匹配
- 请求被传递到
Engine,根据Host头匹配<Host name="www.example.com">
4.应用路径路由
- 在匹配的
Host中,根据URL路径/api/data查找<Context path="/api">,定位到/data/webapps/api目录下的应用。
5.Servlet处理
- 应用内部的
web.xml或注解配置的Servlet根据剩余路径/data处理请求。
6.响应返回
- 处理结果通过
Connector返回客户端。
3.7关键配置文件对比总结
| Tomcat 组件 | Nginx对应结构 | 功能描述 |
| <Connector> | listen 80 | 定义端口和协议 |
| <Engine> | http {} | 全局请求处理容器 |
| <Host> | server {….} | 基于域名的虚拟主机配置 |
| <Context> | location /path | URL 路径与应用映射 |
| <Valve> | access_log 等模块 | 请求处理链的扩展逻辑 |
- 通过理解server.xml的层级结构,可以清晰掌握Tomcat的请求路由逻辑,其设计思想与nginx的模块化配置有异曲同工之妙。
4.tomcat多实例
- tomcat/mysql会用到多实例
- 同1台机器运行多个相同的服务tomcat
- 服务器配置非常高 4颗cpu 32核心 64线程 内存2TB 固态硬盘 U2接口 100T
- 降低配置
- 使用虚拟化(创建虚拟机)
- 服务的多实例(二进制安装,编译安装软件,容器docker运行)
- 注意事项(实现多实例流程与要求):
- 1️⃣同1个服务部署多次/拥有不同的目录
- 2️⃣避免端口冲突
- 3️⃣代码支持(同一份代码在同一机器可运行多份)
- 4️⃣可以通过容器化运行,避免以上问题
5.tomcat监控
- java-11-openjdk-devel软件包包含了
jps,jstack,jmap等命令
jps:java ps 命令只显示java进程 ==ps -ef |grep javajstack:Java进程的线程信息jmap:jvm信息
#1.jps
jps -lvm
显示详细一些(含jps进程自己),根据业务名字(jar包名字过滤,目录名字,产品名字)
#2.jstack 进程 线程
进程: 一个命令,软件,服务运行起来后 占用资源,内存--->厂房
线程: 处理请求,干活 Threads--->工人
1.进程启动(支持多线程)--进程线程一起存在,该软件支持多线程技术(ps aux中的l)
2.进程占用资源,内存
3.资源给线程,线程干活,处理用户请求
ps aux #看进程有L标记 线程的意思
查看具体线程信息
top -p pid -H 显示线程信息
pstree -p
ps -efL
#jstack pid(进程id)
jstack 56979|grep -i thread.state
过滤进程中线程状态.
正常状态:RUNNABLE WAITING blocked阻塞(io)
java进程中线程的状态,每种状态数量.
jstack 56979|grep -i thread.state |awk '{print $2}'|sort |uniq -c
#3.jmap
1)导出指定进程的jvm(java虚拟机)的使用情况信息
jmap -heap 56979 #pid 导出jvm信息 使用率,未来用于自定义监控. jdk8及之前可以这样写
jhsdb jmap --heap --pid 70308 #jdk8之后要这样写
2)保存jvm文件(类似于蓝屏) 然后使用MA T(分析 Memory Analysis Tools)
交给第三方工具去分析文件
#导出jvm内存数据到文件中
jmap -dump:format=b,file=/root/56979.hprof 56979 #b 二进制文件 file指定文件存放位置(以.hprof结尾利于MA软件识别)
#通过MA工具分析(内存分析工具) Memory Ana--->java
windows安装jdk,然后运行MA工具
本质:从linux导出的jvm,在windows下创建了个jvm环境,把jvm导进去

5.1小结
jps:java进程信息jstack:看指定java进程的线程信息,一般关注state部分–>blocked(堵塞)jmap:看jvm信息,导出jvm数据(jvm内存镜像)- mat工具 (桌面)分析
5.2线程的一些状态
| 线程状态 | 描述 |
| NEW | 线程已创建但尚未启动(未调用start()方法) |
| RUNNABLE | 线程正在运行或准备运行,等待CPU调度 |
| BLOCKED | 类似于进程中的D状态,线程被阻塞,要占io,io已经被占满了,不给用,等待获取监视器锁(例如: 进入同步块或方法) |
| WAITING | 线程无限期等待,直到被其他线程显示唤醒(例如: 调用Object.wait()) |
| TIMED_WAITING | 线程在指定时间内等待(例如: 调用Thread.sleep()或Object.wait(timeout)) |
| TERMINATED | 线程已执行完毕,终止状态。 |
6.系统负载高-完整排查流程
- 先排查与解决故障
w,uptime,top,pidstat 1 3(每个进程占cpu(用户态,系统态),io情况,1: 1秒更新1次,此刻正在占用cpu指标的进程,显示3次)cat /proc/进程号(pid)/io过滤此io中进程分别读/写了多少字节。proc下以数字命名的是进程iotop -o本质就是读取/proc/进程号/io中的信息- 后续:
- 根因分析
- 故障现象
- 故障排查流程
- 故障如何解决
- 预防故障
7.zrlog集群模式(动静分离)
7.1环境准备
| 角色 | 说明 |
| lb01,lb02+keepalived | hosts 域名解析至vip |
| web03,web04 | 挂载attached目录web03处理动态,web04处理静态 |
| db01 | |
| nfs01 | 共享/nfs/zrlog目录。实时同步备份至backup节点 |
| backup | 增加模块和目录,修改所有者,重启服务 |
7.2具体实现
[root@nfs01 ~]# showmount -e
Export list for nfs01:
/nfs/zrlog 172.16.1.0/24
/nfs/kodbox 172.16.1.0/24
/nfs/blog 172.16.1.0/24
[root@nfs01 ~]# ll -d /nfs/zrlog/
drwxr-xr-x 3 www www 19 11月 4 17:53 /nfs/zrlog/
[root@nfs01 ~]# systemctl reload nfs
#客户端web03,web04进行挂载测试.先mv移走attached目录,再创建attached目录,挂载好,把内容移回来,测试成功永久挂载
mount -t nfs nfs01:/nfs/zrlog /app/tools/tomcat/webapps/ROOT/attached/
实时同步lsyncd服务
#1.增加以下模块(主要改监控目录和目标目录)
sync {
default.rsync,
source = "/nfs/zrlog",
target = "rsync_backup@172.16.1.41::nfsbackup_zrlog",
delay = 5,
delete = true,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
password_file = "/etc/rsync.client"
}
}
#2.重启lsyncd
systemctl restart lsyncd.service
#1.在/etc/rsyncd.conf配置文件增加以下模块
[nfsbackup_kodbox]
comment = www by cui 18:00 2025-11-1 path = /nfsbackup_kodbox #2.创建模块对应的目录并修改所有者为www #3.重启rsyncd服务 systemctl restart rsyncd.service

总结
- zrlog集群模式(必会)
- zrlog动静分离
- 动静分离(代码中分为动态资源,静态资源)—>专业—>前后端分离
- 部署halo站点–jdk17
- 故障案例: 系统负载高排查流程-java
- tomcat配置文件, 多实例,日志格式