文章目录
- Java
-
- [Java Web中间件选型](#Java Web中间件选型)
- JVM-JDK-JRE
- JDK选型
- JDK长期支持版本
- TOmcat基础功能
- Tomcat应用部署
- JVM相关工具
- 系统负载高完整排查流程
- 动静分离
- 前后端分离
- Tomcat优化
- java测试工具
- JMeter
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长期支持版本
| 版本 | 正式发布日期 | 主要支持截止时间 | 扩展支持截止时间 | 持续支持 |
|---|---|---|---|---|
| 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 版本 | 支持的 Java 版本 |
|---|---|
| 11.0.x 版本 | 17 及以后 |
| 10.1.x | 11 及更高版本 |
| 9.0.x 版本 | 8 及更高版本 |
安装Tomcat(yum/apt安装/二进制安装)m
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处理用户请求流程
shell
①连接建立
用户通过浏览器访问 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处理
shell
war包一般需要tomcat(webapps)。jdk,tomcat+war
例如:memtest.war
把war包移动到webapp下
查看日志catalina.out
浏览器访问 http://ip:8080/memtest/meminfo.jsp
jar包处理
shell
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安装教程-阿里巴巴开源镜像站
shell
#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.
shell
#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)设置开机自启动
shell
#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}" ]; then
logsng "start [Failed] [${time}] 目录 ${dir} 不存在"
echo "错误:目录 ${dir} 不存在"
return 1
fi
# jar文件检查:文件不存在则记录日志并退出
if [ ! -f "${dir}${service}" ]; then
logsng "start [Failed] [${time}] 文件 ${dir}${service} 不存在"
echo "错误:文件 ${dir}${service} 不存在"
return 1
fi
# 检查服务是否已运行
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 ]; then
logsng "start [OK] [${time}] ${service} 启动成功"
echo "${service} 启动成功"
else
logsng "start [Failed] [${time}] ${service} 启动失败"
echo "${service} 启动失败"
fi
else # 服务已运行(pid非空),提示已运行
logsng "start [Failed] [${time}] ${service} 已运行(pid: ${pid})"
echo "${service} 已运行(pid: ${pid})"
fi
}
##关闭服务脚本
function srv_stop() {
#1.pid
pid=$(ps -ef | grep -w "${service}" | grep -v grep | awk '{print $2}')
#2.是否存在pid
if [ -n "${pid}" ]; then
#3.存在则关闭kill pid
kill -9 ${pid}
if [ $? -eq 0 ];then
logsng stop [OK] [${time}] ${service}
else
logsng stop [Failed] [${time}] ${service}
fi
fi
}
##重启
function srv_restart() {
srv_stop
sleep 1
srv_start
}
##状态
function srv_status() {
#1.pid
pid=$(ps -ef | grep -w "${service}" | grep -v grep | awk '{print $2}')
pid_cnt=$(ps -ef | grep -w "${service}" | grep -v grep | wc -l)
#2.是否存在pid
if [ ${pid_cnt} -ge 1 ];then
echo "running [OK] [${pid}] ${service}"
logsng "running [OK] [${pid}] [${time}] ${service}"
else
echo "stopped [Failed] [${time}] ${service}"
logsng "stopped [Failed] [${time}] ${service}"
fi
}
#3.case语句部分
case "$choose" in
start) 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包
shell
#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 热部署,自动加载并运行应用
虚拟主机配置过程(使用配置文件)
- 再添加和配置一个新的虚拟主机
bash
#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>
虚拟机主机配置过程(复制二进制包)
shell
#思路:将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进程信息
shell
jps -lvm
#根据业务名字(jar包名字过滤,目录名字,产品名字)
#选项
jps [-q] [-mlvV] [<hostid>]
-q:静默模式;
-v:显示传递给jvm的命令行参数;
-m:输出传入main方法的参数;
-l:输出main类或jar完全限定名称;
-v:显示通过flag文件传递给jvm的参数;
jstack
查看指定的java进程的线程栈的相关信息
shell
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
用于查看堆内存的使用状态
shell
(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 pid
windows安装MAT进行分析,MAT依赖jdk
系统负载高完整排查流程
流程
先排查与解决故障
后续:
- 根因分析
- 故障现象
- 故障排查流程
- 故障如何解决
- 预防故障

动静分离

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

LNMT部署zrlog个人博客(动静分离集群)-CSDN博客
前后端分离

前后端
- 前端:看到页面(小程序,app,网站)框架vue
- 后端:业务逻辑(登陆,注册,下单,购物,打赏...)java(springboot)
- 前后端源代码->编译->生成可以部署的内容(前端html页面,后端java(war,jar))


部署node.js

官网:Node.js --- Download Node.js®
shell
#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
简易使用前端编译
编译部署中国制霸生成器
shell
#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

Tomcat优化
线程池调整
shell
#server.xml 8080部分
maxThreads="500" #最大线程数200-400之间,具体的数值需要进行压力测试(ab)
acceptCount="500" #当启动线程满了之后,等待队列的最大长度,队列长度acceptCount一般与maxThreads一致
minSpareThreads="10" #最小空闲线程数(使用ps -efL |grep java查看)
maxSpareThreads #最大空闲线程数
acceptorThreadCount="2" #请求分成几队伍进行,数值上与CPU核心总数一致或2倍默认是1
JVM内存空间优化
catalina.sh文件中的内容
- 设置jvm内存大小
- 配置GC日志(垃圾回收)
- 配置自动dump功能
配置JVM内存大小
shell
#1.设置jvm初始化内存大小 一般登录jvm最大内存大小(默认物理内存1/4)
#同样也适用于启动jar包(java命令添加)
#修改 catalina.sh 文件(大约125行)
JAVA_OPTS='-Xms1024m -Xmx1024m -Xloggc:/var/log/tomcat_gc.log'
#2.修改完后重启
systemctl restart tomcat
#3.命令行查看
jps -lvm
jhsdb jmap --heap --pid 7484 | grep 1024
配置GC日志
shell
#配置方法:添加到JAVA_OPTS中即可,或java命令添加
-Xloggc:/var/log/tomcat_gc.log
配置自动DUMP功能(jvm发生异常,自动导出jvm内存镜像)
shell
#配置方法:添加到JAVA_OPTS中即可,或java命令添加
-XX:+HeapDumpOnOutOfMemoryError #OOM故障
-XX:HeapDumpPath=/usr/local/tomcat/temp/oom.hprof
-XX:+HeapDumpOnOutOfMemoryError #开启导出jvm镜像功能,用于java/tomcat加载应用故障,内存不足oom out of memory
-XX:HeapDumpPath=/usr/local/tomcat/temp/oom.hprof
JVM内存空间优化汇总
shell
JAVA_OPTS='-Xms1024m -Xmx1024m -Xloggc:/var/log/tomcat_gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/tomcat/temp/oom.hprof'
io模型优化
- 类似于nginx同步,异步模型
- 决定了tomcat如何处理数据
| IO模型 | 说明 |
|---|---|
| BIO | Blocked IO,阻塞,同步模型.tomcat7及以前版本默认是BIO |
| NIO | New IO,非阻塞,异步模型,tomcat8开始默认就是NIO |
| APR | 应对高并发场景 |
什么是同步,什么是异步
同步:同步指的是多个操作按顺序执行,前一个操作未完成时,后一个操作必须等待,就像 "排队办事"------ 前一个人没结束,下一个人只能等着
异步:异步指的是多个操作可以同时进行,前一个操作未完成时,后一个操作无需等待,可直接开始,就像 "多线程办事"------ 多个任务各自执行,互不阻塞。
简单来说,同步串行,异步并行
DNS压缩
shell
#server.xml 8080部分配置
#禁用DNS反向解析功能,加速访问。域名--->ip ip--->域名
enableLookups="false"
#类似于nginx gzip压缩(推荐在nginx配置)
compression="on" #开启tomcat压缩功能,静态文件资源html js css
compressionMinSize="2048" #大于2048字节的文件才会被压缩
compressableMimeType="text/html,text/css,application/javascript..."#定义启用压缩功能的MIME类型
java测试工具
JMeter
图形化界面,支持模拟复杂场景(如阶梯式并发、混合接口请求、登录态保持),适合测试 Tomcat 承载的完整 Web 应用(如登录→浏览→提交订单的流程)