web中间件——Tomcat
文章目录
- Java
- Java Web中间件选型
- JVM-JDK-JRE
- JDK选型
- JDK长期支持版本
- TOmcat基础功能
- 支持JDK版本
- 安装Tomcat(yum/apt安装/二进制安装)m
- tomcat的文件结构和组成
- 目录结构
- 配置文件
- 组件分层和分类
- 日志文件格式(tomcat vs nginx)
- Nginx和tomcat对比
- tomcat处理用户请求流程
- Tomcat应用部署
- tomcat的根目录结构
- 一般业务代码部署流程
- 打包编译全流程
- Jar包
- war包
- tomcat多虚拟主机(多站点)
- 多虚拟机配置说明
- 虚拟机主机配置过程(复制二进制包)
- JVM相关工具
- jps
- jstack
- jmap
- 系统负载高完整排查流程
- 动静分离
- 什么是动态资源?什么是静态资源?
- LNMP部署zrlog个人博客(动静分离高可用集群)
- 前后端分离
- 前后端
- 部署node.js
- 简易使用前端编译
Java
- java代码
- 根据开发人员使用选择
Java Web中间件选型
| java web 中间件 | 说明 | 应用场景 |
|---|---|---|
| tomcat | 开源免费、轻量级、启动速度快、资源占用少 | 中小型 web 应用、开发测试环境 |
| jetty | 高性能、模块化设计,可嵌入到应用程序中;适合高并发和低延迟场景,支持异步 IO | 嵌入式系统、微服务架构;云原生应用(如 kubernetes、Docker 环境) |
| jboss | 开源、提供企业级功能(如集群、事务管理) | 复杂企业级应用;金融、电信行业的大型分布式系统 |
| weblogic | 商业软件,功能全面(高可用、负载均衡、热部署);稳定性强,但配置复杂,成本高 | 大型企业关键业务系统(如银行核心系统);需要 Oracle 数据库深度集成的场景 |
| 国产:东方通(TongWeb) | 国产中间件,符合国内安全及行业标准(如等保);支持国产化软硬件生态(麒麟 OS、龙芯 CPU) | 政府、军工、金融等对自主可控要求高的领域 |
JVM-JDK-JRE

-
Java:可移植性强,一份代码处处运行,其他语言一般无法做到这点
-
Jvm:java虚拟机,java代码运行在虚拟机中
java一般占用系统资源更多.内存,OOM故障(内存不足,内存溢出)
-
JRE:Java运行时环境,Java 运行时环境,提供了 JVM 和 Java 程序运行所需的必备依赖。如果只是想运行 Java 程序,安装 JRE 即可。
-
JDK:Java 开发工具包,包含了JRE,还额外提供了编译、调试、排障等开发用的命令工具。开发者需要 JDK 来编写、编译 Java 代码。
JDK选型
| JDK选型 | 说明 | 补充 |
|---|---|---|
| jdk(oracle jdk) | 商业版(企业使用收费,个人测试免费) | jdk 8 202 之前免费,211之后收费 |
| openjdk | 开源版本(yum,apt有) | |
| 厂商jdk 华为 毕昇 jdk | 根据厂商选择 |
oracle jdk下载地址:Java Downloads | Oracle 中国
openjdk下载地址:Archived OpenJDK GA Releases
JDK长期支持版本
官网地址:Oracle Java SE Support Roadmap
| 版本 | 正式发布日期 | 主要支持截止时间 | 扩展支持截止时间 | 持续支持 |
|---|---|---|---|---|
| 8(LTS,长期支持版) | 2014 年 3 月 | 2022 年 3 月 | 2030 年 12 月 | 无限期 |
| 9 - 10(非 LTS 版) | 2017 年 9 月 - 2018 年 3 月 | 2018 年 3 月 - 2018 年 9 月 | 无此阶段 | 无限期 |
| 11(LTS,长期支持版) | 2018 年 9 月 | 2023 年 9 月 | 2032 年 1 月 | 无限期 |
| 12 - 16(非 LTS 版) | 2019 年 3 月 - 2021 年 3 月 | 2019 年 9 月 - 2021 年 9 月 | 无此阶段 | 无限期 |
| 17(LTS,长期支持版) | 2021 年 9 月 | 2026 年 9 月 | 2029 年 9 月 | 无限期 |
| 18 - 20(非 LTS 版) | 2022 年 3 月 - 2023 年 3 月 | 2022 年 9 月 - 2023 年 9 月 | 无此阶段 | 无限期 |
| 21(LTS,长期支持版) | 2023 年 9 月 | 2028 年 9 月 | 2031 年 9 月 | 无限期 |
| 22(非 LTS 版) | 2024 年 3 月 | 2024 年 9 月 | 无此阶段 | 无限期 |
| 23(非 LTS 版) | 2024 年 9 月 | 2025 年 3 月 | 无此阶段 | 无限期 |
| 24(非 LTS 版) | 2025 年 3 月 | 2025 年 9 月 | 无此阶段 | 无限期 |
| 25(LTS,长期支持版) | 2025 年 9 月 | 2030 年 9 月 | 2033 年 9 月 | 无限期 |
| 26(非 LTS 版) | 2026 年 3 月 | 2026 年 9 月 | 无此阶段 | 无限期 |
| 27(非 LTS 版) | 2026 年 9 月 | 2027 年 3 月 | 无此阶段 | 无限期 |
具体使用哪个JDK版本,根据代码要求
TOmcat基础功能
支持JDK版本
官方文档:Apache Tomcat® - Which Version Do I Want?
| Apache Tomcat 版本 | 支持的 Java 版本 |
|---|---|
| 11.0.x 版本 | 17 及以后 |
| 10.1.x | 11 及更高版本 |
| 9.0.x 版本 | 8 及更高版本 |
安装Tomcat(yum/apt安装/二进制安装)m
部署各种服务_凤凰战士芭比Q的博客-CSDN博客
tomcat的文件结构和组成
目录结构
| 目录 | 文件 | 说明 |
|---|---|---|
| bin | tomcat的管理脚本 startup.sh shutdown.sh | catalina.sh 做jvm优化修改这个文件 |
| conf | server.xml 主要配置文件 logging.properties日志功能配置文件 | server.xml主要配置 |
| lib | lib(library)tomcat依赖的目录 | 一般是.jar结尾 |
| logs | 日志目录 | 一般看业务/应用日志 关键字:error,failed,exception(异常) |
| webapps | 站点目录 | |
| work | 加载jvm中的文件信息 |
范例:
配置文件
注意:配置文件大小写敏感
| 文件名 | 说明 |
|---|---|
| server.xml | 主配置文件 |
| web.xml | 每个 webapp 只有 “部署” 后才能被访问,它的部署方式通常由 web.xml 进行定义,其存放位置为 WEB-INF / 目录中;此文件为所有的 webapps 提供默认部署相关的配置,每个 web 应用也可以使用专用配置文件,来覆盖全局文件 |
| context.xml | 用于定义所有 web 应用均需加载的 Context 配置,此文件为所有的 webapps 提供默认配置,每个 web 应用也可以使用自已专用的配置,它通常由专用的配置文件 context.xml 来定义,其存放位置为 WEB-INF / 目录中,覆盖全局的文件 |
| tomcat-users.xml | 用户认证的账号和密码文件 |
| catalina.policy | 当使用 security 选项启动 tomcat 时,用于为 tomcat 设置安全策略 |
| catalina.properties | Tomcat 环境变量的配置,用于设定类加载器路径,以及一些与 JVM 调优相关参数 |
| logging.properties | Tomcat 日志系统相关的配置,可以修改日志级别和日志路径等 |
组件分层和分类

顶级组件
Server,代表整个Tomcat容器,一台主机可以启动多tomcat实例,需要确保端口不要产生冲突
服务类组件
Service,实现组织Engine和Connector,建立两者之间关联关系, service 里面只能包含一个Engine
连接器组件
Connector,有HTTP(默认端口8080/tcp)、HTTPS(默认端口8443/tcp)、AJP(默认端口8009/tcp)协议的连接器,AJP(Apache Jserv protocol)是一种基于TCP的二进制通讯协议
容器类
Engine、Host(虚拟主机)、Context(上下文件,解决路径映射)都是容器类组件,可以嵌入其它组件,内部配置如何运行应用程序
内嵌类
可以内嵌到其他组件内,valve、logger、realm、loader、manager等。以logger举例,在不同容器组件内分别定义。
集群类组件
listener、cluster
| 名称 | 说明 |
|---|---|
| Server | 服务器,Tomcat 运行的进程实例,一个 Server 中可以有多个 service,但通常就一个 |
| Service | 服务,用来组织 Engine 和 Connector 的对应关系,一个 service 中只有一个 Engine |
| Connector | 连接器,负责客户端的 HTTP、HTTPS、AJP 等协议连接。一个 Connector 只属于某一个 Engine |
| Engine | 即引擎,用来响应并处理用户请求。一个 Engine 上可以绑定多个 Connector |
| Host | 即虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分 |
| Context | 应用的上下文,配置特定 url 路径映射和目录的映射关系:url => directory |
日志文件格式(tomcat vs nginx)
| 日志(logs/) | 说明 |
|---|---|
| catalina.日期.log | 当天tomcat服务日志 |
| catalina.out | tomcat服务日志 |
| host-manager.日期 | host manager管理日志 |
| localhost.日期.log | 默认主机日志 |
| localhost_access_log.日期.txt | 当天主机访问日志 |
| manager.日期.log | 当天manager管理日志 |
官方文档:Apache Tomcat 9 Configuration Reference (9.0.111) - The Valve Component
| 说明 | tomcat | nginx |
|---|---|---|
| 定义访问日志的格式 | Host 部分的 pattern 定义 | http 区域 log_format 部分 |
| 客户端 ip 地址 | %h | $remote_addr |
| 访问的时间 | %t | $localTime |
| 请求起始行 (请求方法,URL,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 |
Nginx和tomcat对比
| tomcat vs ngx 对比 | tomcat | ngx |
|---|---|---|
| web 端口 | Connector=8080 | listen 80/443 |
| 站点 / 虚拟主机 | 部分 | server {} 部分 |
| 域名 | name=“localhost” | server_name |
| 站点目录 | appBase=“webapps” | root |
| 自动解压 (war 包解压目录) zip 压缩包 | unpackWARs=“true” | 无 |
| 自动部署 (加载 vm) | autoDeploy=“true” | 无 |
tomcat处理用户请求流程
①连接建立
用户通过浏览器访问 http://www.example.com:8080/api/data,请求到达 Tomcat 的 Connector(监听 8080 端口)。②协议处理
Connector 解析 HTTP 协议,生成 Request 和 Response 对象。③虚拟主机匹配
请求被传递到 Engine,根据 Host 头匹配 <Host name="www.example.com">。④应用路径路由
在匹配的 Host 中,根据 URL 路径 /api/data 查找 <Context path="/api">,定位到 /data/webapps/api 目录下的应用。⑤Servlet 处理
应用内部的 web.xml 或注解配置的 Servlet 根据剩余路径 /data 处理请求。⑥响应返回
处理结果通过 Connector 返回客户端。
Tomcat应用部署
tomcat的根目录结构
nginx
Nginx 部署多个网站应用(如 eshop、forum)的核心逻辑:以统一网站根目录(如 /data/nginx/html)为基础,主应用(eshop)直接部署到根目录,其他应用(forum)部署到根目录下的对应子目录,实现多应用共存
tomcat
Tomcat 部署多 Web 应用(如 eshop、forum)的核心规则是 “目录即应用”,以 webapps 为基础目录,ROOT 目录对应默认主站,其他子目录对应独立应用,支持虚拟主机自定义站点目录
tomcat部署规则
- 主应用(eshop):解压文件放入
$CATALINA_BASE/webapps/ROOT/,对应访问路径http://localhost/。 - 其他应用(forum):解压文件放入
$CATALINA_BASE/webapps/[应用名]/(如forum/),对应访问路径http://localhost/[应用名]/(如http://localhost/forum/)
tomcat自动部署
- Tomcat 的 自动部署(Auto-Deploy)功能,默认开启,会自动监测
webapps目录下的 WAR 包并解压为同名目录,旧目录若存在则覆盖
一般业务代码部署流程

war或jar如何部署
war处理
war包一般需要tomcat(webapps)。jdk,tomcat+war例如:memtest.war
把war包移动到webapp下
查看日志catalina.out
浏览器访问 http://ip:8080/memtest/meminfo.jsp
jar包处理
jar包直接运行(jar包内部塞了一个tomcat或jetty)。jdk+jar
java -jar xxx.jar 启动应用(业务)或其他选项jar包 运行时候在jar包所在目录(相对路径)
#前台运行(测试)
java -jar -Dfile.encoding=UTF-8 nginxWebUI-3.4.0.jar --server.port=8848 --project.home=/app/code/nginx/#后台运行(正式)或交给systemctl运行
nohup java -jar -Dfile.encoding=UTF-8 nginxWebUI-3.4.0.jar --server.port=8848 --project.home=/app/code/nginx/ &##开机自启动
#方案01 最简单启动命令写道/etc/rc.local#方案02 书写jar包管理脚本,systemctl调用脚本
1.写脚本(核心case语句)
bash /xxx/xxx/nginxwebui.sh start 运行
bash /xxx/xxx/nginxwebui.sh stop 关闭指定的服务
bash /xxx/xxx/nginxwebui.sh restart 先关闭然后启动
bash /xxx/xxx/nginxwebui.sh status 检查是否允许,如果允许显示pid
2.写服务启动配置文件
cat /lib/systemd/system/tomcatwebui.service
[Unit]
Descripton=nginx webui
Afer=network.target[Service]
Type=forking
ExecStart=bash /xxx/xxx/nginxwebui.sh start
ExecStop=bash /xxx/xxx/nginxwebui.sh stop[Install]
WantedBy=multi-user.target
打包编译全流程
Jar包
(1)安装tomcat、jdk、maven
tomcat和jdk安装:部署Tomcat11(Kylinv10sp3、Ubuntu2204、Rocky9.3)_ubuntu部署tomcat11-CSDN博客
maven下载地址:Download Apache Maven – Maven
maven镜像_maven下载地址_maven安装教程-阿里巴巴开源镜像站
#1.安装tomcat和jdk
#2.安装maven软件包
yum install -y wget;wget https://dlcdn.apache.org/maven/maven-3/3.9.11/binaries/apache-maven-3.9.11-bin.tar.gz -P /download#3.解压maven二进制包
tar -zxvf /download/apache-maven-3.9.11-bin.tar.gz -C /usr/local/#4.设置软链接简化路径
ln -s /usr/local/apache-maven-3.9.11/ /usr/local/maven#5.配置环境变量,并查看maven版本
echo 'export PATH=$PATH:/usr/local/maven/bin' >> /etc/profile
mvn --version#6.配置maven编译加速
#mvn编译本质下载代码需要的jar包依赖,整合依赖生成war包/jar包
#mvn默认从官网下载,速度很慢
#配置maven阿里云加速
#打开 Maven 的配置文件(在maven安装目录的conf/settings.xml)
#在<mirrors></mirrors>标签中添加 mirror 子节点:
<mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public</url>
</mirror>
(2)编译nginxwebui
官网gitee仓库:nginxWebUI.
#1.下载nginxWebUI-master.zip源码包
#2.解压
unzip nginxWebUI-master.zip
cd nginxWebUI-master
#2.使用mvn编译
mvn clean package
#3.运行编译的文件with assembly file: /root/nginxWebUI-master/target/nginxWebUI-4.3.4.jar
#前台测试运行
java -jar -Dfile.encoding=UTF-8 nginxWebUI-4.3.4.jar --server.port=8848 --project.home=/app/code/nginx/
#4.使用curl测试访问
curl http://10.0.0.108:8848
(3)设置开机自启动
#1.把jar包移动到站点目录
mv nginxWebUI-4.3.4.jar /app/code/nginx/
#2.编写脚本
cat > /server/scripts/nginxwebui.sh <<'EOF'
#!/bin/bash
#############################################################################
# File Name: /server/scripts/nginxwebui.sh
# Version: V1.0
# Author: csq
# Organization: blog.chenshiquan.xyz
# Desc:
#############################################################################
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/jdk21/bin:/usr/local/maven/bin:/root/bin#1.vars
service=nginxWebUI-4.3.4.jar
dir=/app/code/nginx/
choose=$1
port=8848
log_file=${dir}nginxwebUI.log
time=`date +%F_%T`#2.函数部分
##日志函数
function logsng() {msg="$*"echo "$*" >> ${log_file}
}##开启服务脚本
function srv_start() {# 目录检查:目录不存在则记录日志并退出if [ ! -d "${dir}" ]; thenlogsng "start [Failed] [${time}] 目录 ${dir} 不存在"echo "错误:目录 ${dir} 不存在"return 1fi# jar文件检查:文件不存在则记录日志并退出if [ ! -f "${dir}${service}" ]; thenlogsng "start [Failed] [${time}] 文件 ${dir}${service} 不存在"echo "错误:文件 ${dir}${service} 不存在"return 1fi# 检查服务是否已运行pid=$(ps -ef | grep -w "${service}" | grep -v grep | awk '{print $2}')if [ -z "${pid}" ]; then # 服务未运行(pid为空),执行启动cd ${dir} || return 1 # 切换目录失败则退出nohup java -jar -Dfile.encoding=UTF-8 ${service} \--server.port=${port} --project.home=${dir} >/dev/null 2>&1 &# 检查启动结果if [ $? -eq 0 ]; thenlogsng "start [OK] [${time}] ${service} 启动成功"echo "${service} 启动成功"elselogsng "start [Failed] [${time}] ${service} 启动失败"echo "${service} 启动失败"fielse # 服务已运行(pid非空),提示已运行logsng "start [Failed] [${time}] ${service} 已运行(pid: ${pid})"echo "${service} 已运行(pid: ${pid})"fi
}##关闭服务脚本
function srv_stop() {#1.pidpid=$(ps -ef | grep -w "${service}" | grep -v grep | awk '{print $2}')#2.是否存在pidif [ -n "${pid}" ]; then#3.存在则关闭kill pidkill -9 ${pid}if [ $? -eq 0 ];thenlogsng stop [OK] [${time}] ${service}elselogsng stop [Failed] [${time}] ${service}fifi
}##重启
function srv_restart() {srv_stopsleep 1srv_start
}##状态
function srv_status() {#1.pidpid=$(ps -ef | grep -w "${service}" | grep -v grep | awk '{print $2}')pid_cnt=$(ps -ef | grep -w "${service}" | grep -v grep | wc -l)#2.是否存在pidif [ ${pid_cnt} -ge 1 ];thenecho "running [OK] [${pid}] ${service}"logsng "running [OK] [${pid}] [${time}] ${service}"elseecho "stopped [Failed] [${time}] ${service}"logsng "stopped [Failed] [${time}] ${service}"fi
}#3.case语句部分
case "$choose" instart) srv_start ;;stop) srv_stop ;;restart) srv_restart ;;status) srv_status ;;*) echo "input error" ;;
esac
EOF#3.配置启动文件
cat > /usr/lib/systemd/system/nginxwebui.service <<EOF
[Unit]
Description=nginx webui
After=network.target
[Service]
Type=forking
#EnvironmentFile=/etc/sysconfig/tomcat
ExecStart=/bin/bash /server/scripts/ngxwebui.sh start
ExecStop=/bin/bash /server/scripts/ngxwebui.sh stop
[Install]
WantedBy=multi-user.target
EOF#4.设置开机自启动并开启服务,查看状态
systemctl daemon-reload && systemctl enable --now nginxwebui && systemctl status nginxwebui#5.放行8848端口
firewall-cmd --add-port=8848/tcp --permanent
firewall-cmd --reload
(4)浏览器访问
设置完用户名密码,登陆

war包
#1.war包移动到tomcat根目录下的webapps中
mv memtest.war /usr/local/tomcat/webapps/
#2.查看war包解压内容
cd /usr/local/tomcat/webapps/
ls memtest
meminfo.jsp META-INF
#3.访问测试
curl http://10.0.0.108:8080/memtest/meminfo.jsp
tomcat多虚拟主机(多站点)
Tomcat 的 “多虚拟主机(多站点)” 是指在同一台 Tomcat 服务器上,通过配置多个Host组件,实现同时部署多个独立网站(站点),并通过不同的域名(或端口)区分访问。
多虚拟机配置说明
- name 必须是主机名,用主机名来匹配
- appBase 当前主机的网页根目录,是相对于$CATALINA_HOME,也可以使用绝对路径
- unpackWARs 是否自动解压war格式
- autoDeploy 热部署,自动加载并运行应用
虚拟主机配置过程(使用配置文件)
- 再添加和配置一个新的虚拟主机
#1.添加虚拟主机
vim /usr/local/tomcat/conf/server.xml
#在默认的<Host>
.....
.....
#</Host>下面添加<Host name="test.chenshiquan.xyz" appBase="csqwebapp"unpackWARs="true" autoDeploy="true"><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access" suffix=".log"pattern="%h %l %u %t "%r" %s %b "%{Referer}i""%{User-Agent}i" "%{X-Forwarded-For}i"" /></Host>
虚拟机主机配置过程(复制二进制包)
#思路:将tomcat安装包解压多份进行配置
#默认tomcat安装目录还有一个虚拟主机主机
#第二个虚拟主机主机
mkdir -p /app/code
tar -zxvf /download/apache-tomcat-9.0.111.tar.gz -C /app/code/
mv /app/code/apache-tomcat-9.0.111/ /app/code/tomcat8081
sed -i 's/8080/8081/g' /app/code/tomcat8081/conf/server.xml
sed -i 's/8005/8006/g' /app/code/tomcat8081/conf/server.xml
echo "8081" > /app/code/tomcat8081/webapps/ROOT/index.jsp
/app/code/tomcat8081/bin/startup.sh
#第三个虚拟主机主机
tar -zxvf /download/apache-tomcat-9.0.111.tar.gz -C /app/code/
mv /app/code/apache-tomcat-9.0.111/ /app/code/tomcat8081
sed -i 's/8080/8082/g' /app/code/tomcat8082/conf/server.xml
sed -i 's/8005/8007/g' /app/code/tomcat8082/conf/server.xml
echo "8082" > /app/code/tomcat8082/webapps/ROOT/index.jsp
/app/code/tomcat8082/bin/startup.sh#测试访问
[root@web04 ~]# curl 10.0.0.109:8081
8081
[root@web04 ~]# curl 10.0.0.109:8082
8082
JVM相关工具
JVM
| 命令 | 说明 |
|---|---|
| jps | 查看所有 jvm 进程 |
| jinfo | 查看进程的运行环境参数,主要是 jvm 命令行参数 |
| jstat | 对 jvm 应用程序的资源和性能进行实时监控 |
| jstack | 查看所有线程的运行状态 |
| jmap | 查看 jvm 占用物理内存的状态 |
| jhat +UseParNew | (注:jhat 用于分析 jmap 生成的堆转储文件,UseParNew 是垃圾收集器参数) |
| jconsole | 图形工具 |
| jvisualvm | 图形工具 |
jps
查看java进程信息
jps -lvm
#根据业务名字(jar包名字过滤,目录名字,产品名字)
#选项
jps [-q] [-mlvV] [<hostid>]
-q:静默模式;
-v:显示传递给jvm的命令行参数;
-m:输出传入main方法的参数;
-l:输出main类或jar完全限定名称;
-v:显示通过flag文件传递给jvm的参数;
jstack
查看指定的java进程的线程栈的相关信息
jstack [-l] <pid>
jstack -F [-m] [-l] <pid>
#选项
-l:long listings,会显示额外的锁信息,因此,发生死锁时常用此选项
-m:混合模式,既输出java堆栈信息,也输出C/C++堆栈信息
-F:当使用"jstack -l PID"无响应,可以使用-F强制输出信息
- ps aux进程有L标记 线程的意思
- top -Hp pid 显示线程信息
- pstree -pu
- ps -efL
| 线程状态 | 描述 |
|---|---|
| NEW | 线程已创建但尚未启动(未调用 start() 方法)。 |
| RUNNABLE | 线程正在运行或准备运行,等待 CPU 调度。 |
| BLOCKED | 线程被阻塞,等待获取监视器锁(例如,进入同步块或方法)。 |
| WAITING | 线程无限期等待,直到被其他线程显式唤醒(例如,调用 Object.wait())。 |
| TIMED_WAITING | 线程在指定时间内等待(例如,调用 Thread.sleep() 或 Object.wait(timeout))。 |
| TERMINATED | 线程已执行完毕,终止状态。 |
jmap
用于查看堆内存的使用状态
(1)导出jvm信息 使用情况
jmap -heap pid #导出jvm信息 使用率。<==jdk8之前
jhsdb jmap --heap --pid xxx #jdk8之后(2)保存jvm文件(类似于windows蓝屏信息)。然后使用MAT(memory ana tools)分析
jmap -dump:format=b,file=/root/xxx.hprof pidwindows安装MAT进行分析,MAT依赖jdk
系统负载高完整排查流程
流程
先排查与解决故障
后续:
- 根因分析
- 故障现象
- 故障排查流程
- 故障如何解决
- 预防故障

动静分离

什么是动态资源?什么是静态资源?
静态资源:
是什么:静态内容是固定不变的资源,内容不会因为用户请求、时间等条件变化而改变,本质是“预先生成的固定文件”
怎么来的:静态资源通常是由开发者预先创建并保存为具体文件比如前端开发编写的 CSS 样式表、JS 脚本、纯 HTML 页面比如用户上传的图片、视频、音频等
静态资源由nginx自行处理动态资源:
是什么:动态资源是内容随请求条件动态生成的资源,其内容依赖用户身份、请求参数、数据库数据、时间等因素,每次请求可能返回不同结果,本质是 “服务器实时计算的动态内容”
怎么来的:当用户发送请求(如访问 “我的订单” 页面、搜索商品),服务器接收请求后,通过后端语言(如 PHP、Python、Java)或框架(如 Django、Spring)处理逻辑;
可能需要查询数据库(如获取用户的订单数据、商品库存)、解析请求参数(如搜索关键词)、结合时间或用户身份(如登录状态);
最终动态生成内容(如 HTML 页面、JSON 数据),并返回给用户动态资源的核心作用是提供个性化、实时性的内容,满足交互和动态需求
LNMP部署zrlog个人博客(动静分离高可用集群)

LNMT部署zrlog个人博客(动静分离集群)-CSDN博客
前后端分离
前后端分离部署学之思在线考试系统-CSDN博客
前后端
- 前端:看到页面(小程序,app,网站)框架vue
- 后端:业务逻辑(登陆,注册,下单,购物,打赏…)java(springboot)
- 前后端源代码->编译->生成可以部署的内容(前端html页面,后端java(war,jar))


部署node.js

官网:Node.js — Download Node.js®
#1.下载node.js v16.19.1
#2.解压到/usr/local/下
tar -xf https://nodejs.org/dist/v24.11.0/node-v24.11.0-linux-x64.tar.xz -C /usr/local/
#3.软链接简化路径
ln -s /usr/local/node-v24.11.0-linux-x64/ /usr/local/node
#4.修改所有者
chown -R root:root /usr/local/node-v24.11.0-linux-x64/
#5.配置PATH环境变量
echo 'export PATH=$PATH:/usr/local/node/bin' >> /etc/profile
source /etc/profile
#6.配置npm国内下载源
npm config set registry https://registry.npmmirror.com
cat ~/.npmrc #源存放路径
#7.检查node.js版本和npm版本
npm --version && node --version
简易使用前端编译
编译部署中国制霸生成器
官网:github.com/itorr/china-ex
#1.下载中国制霸生成器的前端包
wget https://github.com/itorr/china-ex/archive/refs/heads/main.zip -P /download/
#2.解压进行编译
unzip /download/main.zip -d /download/
cd /download/china-ex-main/#3.package.json 配置文件
#下载前端依赖各种js文件。很大 下载到代码目录的node_modules目录下
npm install #简写npm i
#4.打包编译
npm run build
#5.生成在dist目录(未来不一定都是这个目录)
[root@web03 /download/china-ex-main]# ll dist/
总用量 16
-rw-r--r-- 1 root root 2385 11月 5 03:34 脚本.js
-rw-r--r-- 1 root root 2314 11月 5 03:34 样式.css
-rw-r--r-- 1 root root 0 11月 5 03:34 字体.woff
-rw-r--r-- 1 root root 5501 11月 5 03:34 index.html
#6.传输到web nginx站点目录
cp -rf dist/* /app/code/china/
#7.配置nginx站点配置文件
cat > /etc/nginx/conf.d/china.chenshiquan.xyz.conf <<EOF
server {listen 80;server_name china.chenshiquan.xyz;root /app/code/china/;location / {index index.html;}
}
EOF
#8.重启加载nginx配置文件
systemctl reload nginx
浏览器访问windows 添加hosts解析,10.0.0.108 china.chenshiquan.xyz

