MD原文档下载:百度网盘
JAVA运维
一、若依部署
1.1 相关概念
1.1.1 关于若依
若依是一套开源的 Java 快速开发平台, 半成品的后台管理系统,包含用户管理、菜单管理、权限控制、日志记录等基础功能
官网:http://ruoyi.vip
1.1.2 部署方式
- JAR 包 : 内嵌 Tomcat
- WAR 包 : 外置 Tomcat
1.1.3 关于 Tomcat
Java 生态中最常用的 Web 应用服务器,于运行 WAR 包形式的 Java Web 应用
1.2 案例一 : 若依经典版部署 (Tomcat + WAR包)
1.2.1 整体架构

1.2.2 部署环境
| 主机名 | 角色 | IP 地址 | 核心软件 |
|---|---|---|---|
db-mysql | MySQL 数据库服务器 | 10.0.0.101 | MySQL 8.x |
db-redis | Ridis 缓存服务器 | 10.0.0.102 | Redis 6.x / 7.x |
ruoyi-java | 应用服务器 | 10.0.0.103 | JDK 8 + Tomcat 9 |
# 操作系统版本: Rocky 9
# 配置主机名
hostnamectl set-hostname db-mysql
hostnamectl set-hostname db-redis
hostnamectl set-hostname ruoyi-java
# 配置 DNS 解析
cat >> /etc/hosts << 'EOF'
10.0.0.101 db-mysql
10.0.0.102 db-redis
10.0.0.103 ruoyi-java
EOF
# 配置 IP
nmcli connection modify eth0 ipv4.addresses 10.0.0.101/24
nmcli connection modify eth0 ipv4.addresses 10.0.0.102/24
nmcli connection modify eth0 ipv4.addresses 10.0.0.103/24
nmcli connection up eth0
1.2.3 MySQL 初始化
# 克隆若依项目(获取SQL文件)
git clone -b springboot2 https://gitee.com/y_project/RuoYi.git
# 安装 mysql 服务端并启动
dnf install -y mysql-server
systemctl enable --now mysqld
# 创建数据库和用户并授权
mysql -u root << 'EOF'
CREATE DATABASE ruoyi DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'ruoyi'@'10.0.0.%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON ruoyi.* TO 'ruoyi'@'10.0.0.%';
FLUSH PRIVILEGES;
EOF
# 导入若依初始数据到 ruoyi 数据库,注意文件名称以实际为准
mysql -u root ruoyi < RuoYi/sql/ry_20260319.sql
mysql -u root ruoyi < RuoYi/sql/quartz.sql
# 在 ruoyi-java 服务器安装 mysql 客户端,测试连接数据库,输出 ruoyi 创建的 30+ 初始表即正常
dnf -y install mysql
mysql -h db-mysql -uruoyi -p123456 ruoyi -e 'show tables;'
1.2.4 Redis 初始化
# 安装 redis
dnf install -y redis
# 配置 redis, 允许远程连接 + 设置密码
sed -i '/^bind 127.0.0.1/c bind 0.0.0.0' /etc/redis/redis.conf
sed -i '/^# requirepass/c requirepass 123456' /etc/redis/redis.conf
# 启动 redis
systemctl enable --now redis
# 在 ruoyi-java 服务器测试 redis 连通性,输出 PONG 则正常
dnf -y install redis
redis-cli -h db-redis -a 123456 ping
1.2.5 部署应用服务器
在 ruoyi-java 上执行
# 安装 JDK
dnf install -y java-1.8.0-openjdk-devel
# 配置全局环境变量
tee /etc/profile.d/java.sh << 'EOF'
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$JAVA_HOME/bin:$PATH
EOF
. /etc/profile.d/java.sh
# 查看 java 版本信息
java -version
# 在线下载 tomcat 9, 或在 Windows 下载传入服务器
wget https://downloads01-he-fi.apache.org/tomcat/tomcat-9/v9.0.118/bin/apache-tomcat-9.0.118.tar.gz
tar xf apache-tomcat-9.0.118.tar.gz -C /usr/local/
ln -s /usr/local/apache-tomcat-9.0.118/ /usr/local/tomcat
# 创建专用用户
useradd -r -s /sbin/nologin tomcat
chown -R tomcat:tomcat /usr/local/tomcat/
# 创建 Systemd 服务
tee /etc/systemd/system/tomcat.service << 'EOF'
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk"
Environment="CATALINA_HOME=/usr/local/tomcat"
Environment="CATALINA_BASE=/usr/local/tomcat"
Environment="CATALINA_PID=/usr/local/tomcat/temp/tomcat.pid"
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
# 启动 Tomcat
systemctl daemon-reload
systemctl enable --now tomcat
# 验证 Tomcat 是否启动成功
systemctl status tomcat
ss -ntlp | grep 8080
ps aux | grep tomcat
# Windows添加解析记录后访问,显示 Tomcat 首页即正常
10.0.0.103 ruoyi.deng.org
http://ruoyi.deng.org:8080/
# 克隆若依项目
git clone -b springboot2 https://gitee.com/y_project/RuoYi.git
# 配置数据库连接
cd RuoYi/
vim ruoyi-admin/src/main/resources/application-druid.yml

# 配置 Redis 连接
vim ruoyi-admin/src/main/resources/application.yml

# 修改 pom.xml,打包成 WAR
vim ruoyi-admin/pom.xml
# 找到 <packaging>jar</packaging> ,将 jar 改成 war
<packaging>war</packaging>
# 修改启动类(让Spring Boot支持WAR部署)
vim ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
# :%d 删除全文后粘贴以下内容
package com.ruoyi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class RuoYiApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(RuoYiApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(RuoYiApplication.class, args);
System.out.println("(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ ");
}
}
# 安装 Maven
dnf -y install maven
# 构建前需要确认 java 版本为 8
java -version
# 修改日志文件路径
sed -i 's|<property name="log.path" value=".*" />|<property name="log.path" value="/usr/local/tomcat/logs/ruoyi" />|' ruoyi-admin/src/main/resources/logback.xml
# 打包构建
mvn clean package -Dmaven.test.skip=true
# 打包成功后, WAR 包位置
ll ruoyi-admin/target/ruoyi-admin.war
# 将 WAR 包复制到 Tomcat 的 webapps 目录
cp ruoyi-admin/target/ruoyi-admin.war /usr/local/tomcat/webapps/
# Tomcat 会自动解压并部署
ls /usr/local/tomcat/webapps/
# 查看日志确认部署成功
tail -f /usr/local/tomcat/logs/catalina.out
# 日志出现以下类似输出表示启动成功
06-Aug-2026 16:46:24.447 INFO [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/apache-tomcat-9.0.118/webapps/ruoyi-admin.war] has finished in [8,155] ms
# 浏览器访问,出现登录页面即启动成功
http://ruoyi.deng.org:8080/ruoyi-admin
1.3 案例二 : 若依 Vue 版部署 (Nginx + JAR包)
1.3.1 整体架构

1.3.2 部署环境
| 层级 | 主机名 | 作用 | IP 地址 | 核心软件 |
|---|---|---|---|---|
| 接入层 | ruoyi-web | 反向代理、静态资源 | 10.0.0.101 | Nginx |
| 应用层 | ruoyi-java1 | 业务逻辑 | 10.0.0.111 | 若依 JAR |
| 缓存层 | db-redis | 会话管理、缓存 | 10.0.0.121 | Redis |
| 数据层 | db-mysql | 数据持久化 | 10.0.0.131 | MySQL |
# 操作系统版本: Rocky 10
# 配置主机名
hostnamectl set-hostname ruoyi-web
hostnamectl set-hostname ruoyi-java1
hostnamectl set-hostname db-redis
hostnamectl set-hostname db-mysql
# 配置 DNS 解析
cat >> /etc/hosts << 'EOF'
10.0.0.101 ruoyi-web
10.0.0.111 ruoyi-java1
10.0.0.121 db-redis
10.0.0.131 db-mysql
EOF
# 配置 IP
nmcli connection modify eth0 ipv4.addresses 10.0.0.101/24
nmcli connection modify eth0 ipv4.addresses 10.0.0.111/24
nmcli connection modify eth0 ipv4.addresses 10.0.0.121/24
nmcli connection modify eth0 ipv4.addresses 10.0.0.131/24
nmcli connection up eth0
1.3.3 MySQL 初始化
# 克隆若依项目(获取SQL文件)
git clone https://gitee.com/y_project/RuoYi-Vue.git
# 安装 mysql 服务端并启动
dnf install -y mysql8.4-server
systemctl enable --now mysqld
# 创建数据库和用户并授权
mysql -u root << 'EOF'
CREATE DATABASE ruoyi DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'ruoyi'@'10.0.0.%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON ruoyi.* TO 'ruoyi'@'10.0.0.%';
FLUSH PRIVILEGES;
EOF
# 导入若依初始数据到 ruoyi 数据库,注意文件名称以实际为准
mysql -u root ruoyi < RuoYi-Vue/sql/ry_20260417.sql
mysql -u root ruoyi < RuoYi-Vue/sql/quartz.sql
# 在 ruoyi-java1 服务器安装 mysql 客户端,测试连接数据库,输出 ruoyi 创建的 30+ 初始表即正常
dnf -y install mysql8.4
mysql -h db-mysql -uruoyi -p123456 ruoyi -e 'show tables;'
1.3.4 Redis 初始化
# 添加 Redis 官方 RPM 源
cat > /etc/yum.repos.d/redis.repo <<EOF
[Redis]
name=Redis
baseurl=https://packages.redis.io/rpm/rockylinux10
enabled=1
gpgcheck=1
gpgkey=https://packages.redis.io/gpg
EOF
dnf makecache
# 安装 redis
dnf install -y redis
# 配置 redis, 允许远程连接 + 设置密码
sed -i '/^bind 127.0.0.1/c bind 0.0.0.0' /etc/redis/redis.conf
sed -i '/^# requirepass/c requirepass 123456' /etc/redis/redis.conf
# 启动 redis
systemctl enable --now redis
# 在 ruoyi-java1 服务器测试 redis 连通性,输出 PONG 则正常
dnf -y install redis
redis-cli -h db-redis -a 123456 ping
1.3.5 构建 jar 包
在 ruoyi-java1 操作
# 克隆若依源码
git clone https://gitee.com/y_project/RuoYi-Vue.git
cd RuoYi-Vue
# 配置 mysql 连接
vim ruoyi-admin/src/main/resources/application-druid.yml
url: jdbc:mysql://db-mysql:3306/ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: ruoyi
password: 123456
# 配置 redis 连接
vim ruoyi-admin/src/main/resources/application.yml

# 修改日志路径
vim ruoyi-admin/src/main/resources/logback.xml
<!-- 日志存放路径 -->
<property name="log.path" value="/var/log/ruoyi-vue" />
# 安装 maven 并构建
dnf -y install maven
mvn clean package -DskipTests
# 确认 jar 包生成
ls ruoyi-admin/target/ruoyi-admin.jar
# 创建专用用户
useradd -u 3000 -r ruoyi
# 创建 jar 包目录,日志目录,外部配置文件目录
mkdir -p /opt/ruoyi-vue/app /var/log/ruoyi-vue /opt/ruoyi-vue/config
# 将构建的 jar 包复制到 jar 包目录
cp ruoyi-admin/target/ruoyi-admin.jar /opt/ruoyi-vue/app/
# 更改属主属组
chown -R ruoyi:ruoyi /opt/ruoyi-vue/ /var/log/ruoyi-vue
chmod -R 755 /opt/ruoyi-vue/ /var/log/ruoyi-vue
1.3.6 手动测试
# 手动启动
java -jar /opt/ruoyi-vue/app/ruoyi-admin.jar
# 测试访问
curl ruoyi-java1:8080
欢迎使用RuoYi后台管理框架,当前版本:v3.9.2,请通过前端地址访问。 # 启动成功
1.3.7 创建外部配置文件
当 jar 包在其他环境部署时,使用的配置与构建时不一致(例如数据库配置),通过外部配置文件改变配置,而不用重新构建
# 创建外部配置文件
cat > /opt/ruoyi-vue/config/application.yml << 'EOF'
spring:
profiles:
active: prod,druid
EOF
cat > /opt/ruoyi-vue/config/application-prod.yml << 'EOF'
spring:
datasource:
druid:
master:
url: jdbc:mysql://db-mysql:3306/ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: ruoyi
password: 123456
data:
redis:
host: db-redis
port: 6379
password: 123456
ruoyi:
profile: /opt/ruoyi-vue/upload
logging:
file:
name: /opt/ruoyi-vue/logs/ruoyi.log
level:
com.ruoyi: info
org.springframework: warn
EOF
chown -R ruoyi:ruoyi /opt/ruoyi-vue/config
# 使用外部配置文件手动启动
java -jar /opt/ruoyi-vue/app/ruoyi-admin.jar --spring.config.additional-location=file:/opt/ruoyi-vue/config/
# 测试访问
curl ruoyi-java1:8080
1.3.8 创建 Systemd 服务
# 创建服务文件
cat > /etc/systemd/system/ruoyi-vue.service << 'EOF'
[Unit]
Description=RuoYi Vue Backend Service
After=network.target
[Service]
Type=simple
User=ruoyi
Group=ruoyi
WorkingDirectory=/opt/ruoyi-vue
ExecStart=/usr/bin/java \
-Xms512m \
-Xmx1024m \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/opt/ruoyi-vue/logs/heapdump.hprof \
-Dfile.encoding=UTF-8 \
-jar /opt/ruoyi-vue/app/ruoyi-admin.jar \
--spring.config.additional-location=file:/opt/ruoyi-vue/config/ \
--spring.profiles.active=prod,druid
SuccessExitStatus=143
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
Environment="TZ=Asia/Shanghai"
[Install]
WantedBy=multi-user.target
EOF
# 启动 ruoyi-vue
systemctl daemon-reload && systemctl enable --now ruoyi-vue
# 测试访问
curl ruoyi-java1:8080
1.3.9 前端部署
在 ruoyi-web 操作
# 安装Node.js 18,若依推荐
curl -fsSL https://rpm.nodesource.com/setup_18.x | bash -
dnf install -y nodejs
node -v
npm -v
git clone https://gitee.com/y_project/RuoYi-Vue.git
cd RuoYi-Vue/ruoyi-ui/
# 配置npm镜像源(加速)
npm config set registry https://registry.npmmirror.com
# 安装依赖并打包
npm install
npm run build:prod
# 打包后产物,需要移动到 Nginx 目录下
ls dist/
# 安装 nginx 并启动
dnf install -y nginx
systemctl enable --now nginx
# 创建网站根目录,将若依打包生成的前端文件拷贝到该目录,修改文件权限
mkdir -p /opt/ruoyi/dist
cp -r dist/* /opt/ruoyi/dist/
chown -R nginx:nginx /opt/ruoyi/dist
chmod -R 755 /opt/ruoyi/dist
# 创建 Nginx 配置
cat > /etc/nginx/conf.d/ruoyi-vue.conf << 'EOF'
upstream ruoyi_backend {
server ruoyi-java1:8080;
keepalive 32;
}
server {
listen 80;
server_name ruoyi.deng.org deng.org;
client_max_body_size 100m;
# ===== 前端静态资源 =====
location / {
root /opt/ruoyi/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
# ===== 后端 API 代理 =====
location /prod-api/ {
proxy_pass http://ruoyi_backend/;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# ===== 上传文件路径 =====
location /profile/ {
alias /opt/ruoyi/uploadPath/;
}
}
EOF
# 重载 Nginx 配置
nginx -t && systemctl reload nginx
# Windows 添加解析记录
10.0.0.101 ruoyi.deng.org deng.org
# 浏览器测试访问
http://deng.org/
1.3.10 配置 HTTPS
# 创建证书目录并将准备的证书文件放入,这里使用 Nginx 章节生成的内网泛域名证书
mkdir -p /opt/ca
# 编辑 Nginx 配置文件,添加证书配置和 HTTP 跳转
vim /etc/nginx/conf.d/ruoyi-vue.conf
upstream ruoyi_backend {
server ruoyi-java1:8080;
server ruoyi-java2:8080;
server ruoyi-java3:8080;
keepalive 32;
}
server {
listen 443 ssl;
server_name ruoyi.deng.org deng.org;
# ===== HTTPS 证书 ===== 添加证书配置
ssl_certificate /opt/ca/deng.crt;
ssl_certificate_key /opt/ca/deng.key;
client_max_body_size 100m;
# ===== 前端静态资源 =====
location / {
root /opt/ruoyi/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
# ===== 后端 API 代理 =====
location /prod-api/ {
proxy_pass http://ruoyi_backend/;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# ===== 上传文件路径 =====
location /profile/ {
alias /opt/ruoyi/uploadPath/;
}
}
# ===== HTTP 跳转 HTTPS ===== 添加HTTP跳转
server {
listen 80;
server_name ruoyi.deng.org deng.org;
return 301 https://ruoyi.deng.org$request_uri;
}
# 重载 Nginx 配置
nginx -t && systemctl reload nginx
# 浏览器测试访问
http://deng.org/
1.4 案例三 : 若依 Vue 版后端扩容
1.4.1 部署环境
| 层级 | 主机名 | 作用 | IP 地址 | 核心软件 |
|---|---|---|---|---|
| 接入层 | ruoyi-web | 反向代理、静态资源 | 10.0.0.101 | Nginx |
| 应用层 | ruoyi-java1 | 业务逻辑 | 10.0.0.111 | 若依 JAR |
ruoyi-java2 | 业务逻辑 | 10.0.0.112 | 若依 JAR | |
ruoyi-java3 | 业务逻辑 | 10.0.0.113 | 若依 JAR | |
| 缓存层 | db-redis | 会话管理、缓存 | 10.0.0.121 | Redis |
| 数据层 | db-mysql | 数据持久化 | 10.0.0.131 | MySQL |
# 操作系统版本: Rocky 10
# 在 ruoyi-java2 和 ruoyi-java3 操作
# 配置主机名
hostnamectl set-hostname ruoyi-java2
hostnamectl set-hostname ruoyi-java3
# 配置 DNS 解析,修改所有主机 hosts 解析记录
cat >> /etc/hosts << 'EOF'
10.0.0.101 ruoyi-web
10.0.0.111 ruoyi-java1
10.0.0.112 ruoyi-java2
10.0.0.113 ruoyi-java3
10.0.0.121 db-redis
10.0.0.131 db-mysql
EOF
# 配置 IP
nmcli connection modify eth0 ipv4.addresses 10.0.0.112/24
nmcli connection modify eth0 ipv4.addresses 10.0.0.113/24
nmcli connection up eth0
1.4.2 安装 JDK
# 在原有后端节点 ruoyi-java1 查看 JDK 版本,扩容节点安装相同版本
java -version
# 扩容节点安装 JDK
dnf -y install java-21-openjdk
# 确认 JDK 版本
java -version
1.4.3 部署若依后端
# 创建专用用户
useradd -u 3000 -s /sbin/nologin ruoyi
# 创建 jar 包目录,日志目录,外部配置文件目录
mkdir -p /opt/ruoyi-vue/app /var/log/ruoyi-vue /opt/ruoyi-vue/config
# 将构建的 jar 包复制到 jar 包目录
rsync -a ruoyi-java1:/opt/ruoyi-vue/app/ /opt/ruoyi-vue/app
# 将 外部配置文件 复制到扩容节点
rsync -a ruoyi-java1:/opt/ruoyi-vue/config/ /opt/ruoyi-vue/config
# 将 Systemd 服务文件 复制到扩容节点
rsync -a ruoyi-java1:/etc/systemd/system/ruoyi-vue.service /etc/systemd/system/ruoyi-vue.service
# 更改属主属组和权限
chown -R ruoyi:ruoyi /opt/ruoyi-vue/ /var/log/ruoyi-vue
chmod -R 755 /opt/ruoyi-vue/ /var/log/ruoyi-vue
# 启动 ruoyi
systemctl daemon-reload && systemctl enable --now ruoyi-vue
# 验证
systemctl status ruoyi-vue
curl ruoyi-java2:8080
curl ruoyi-java3:8080
1.4.4 配置 Nginx 负载均衡
在 ruoyi-web 操作
vim /etc/nginx/conf.d/ruoyi-vue.conf
upstream ruoyi_backend {
server ruoyi-java1:8080;
server ruoyi-java2:8080;
server ruoyi-java3:8080;
keepalive 32;
}
nginx -t && systemctl reload nginx
# 验证
# 浏览器测试访问
http://deng.org/
# 停止 ruoyi-java1
systemctl stop ruoyi-vue
# 浏览器测试访问
http://deng.org/
# 停止 ruoyi-java2
systemctl stop ruoyi-vue
# 浏览器测试访问
http://deng.org/
# 停止 ruoyi-java3
systemctl stop ruoyi-vue
# 浏览器测试访问
http://deng.org/
# 当所有后端节点停止后,浏览器出现 502 错误
二、Java 核心概念
2.1 JDK、JRE、JVM的关系
- JDK : 开发工具包,包含 Java 开发工具和 JRE
- JRE : 运行环境,包含 核心类库和 JVM
- JVM : 虚拟机,在系统上执行编译后的 Java 字节码
Java 8 之后版本不再提供独立的 JRE 安装包,只能安装 JDK
JDK有 2 个选项,完整 JDK 和 JDK Headless,生产环境推荐JDK Headless,占用体积较小
2.2 版本选择
选择 LTS 版本,以下是目前可用 LTS 版本
| 版本 | 免费支持结束 | 适用场景 |
|---|---|---|
| Java 8 (1.8) | 2030 | 旧项目使用 |
| Java 11 | 2032 | 推荐 |
| java 17 | 2029 | 推荐 |
| Java 21 | 2031 | 新项目可使用 |
| Java 25 | 2033 | 新项目首选 |
2.3 Oracle JDK 与 OpenJDK
- Oracle JDK : 官方 JDK,开发/测试免费,生产付费
- OpenJDK : 开源 JDK,完全免费,推荐
2.4 OpenJDK 安装
Rocky
# 安装
dnf install -y java-17-openjdk-headless
dnf install -y java-11-openjdk-headless
# 验证
java -version
2.5 JVM 内存结构
重点关注 Heap (堆)内存结构
堆内存包括 新生代 和 老年代
新生代包括 Eden 区 、 Survivor 0 区 和 Survivor 1 区
新对象先放在 Eden 区, Eden 满了就触发 Minor GC, 没被回收的对象移到 Survivor 区. 之后每经历一次 Minor GC, 对象年龄就加 1, 年龄到默认 15 岁, 或者Survivor 区装不下了, 就会搬到老年代. 在老年代里一直待到没任何引用, 才会被 FullGC 回收
2.6 GC 垃圾回收
回收不可达对象
分为 Minor GC 和 Full GC, 生产环境重点关注 **Full GC **的频率和耗时
2.7 常用 JVM 参数
| 参数 | 含义 | 建议 |
|---|---|---|
-Xms | 初始堆内存大小 | 与 -Xmx 设置相同值,避免动态扩容开销 |
-Xmx | 最大堆内存大小 | 物理内存的 50% ~ 70% |
-XX:+useG1GC | 使用 G1 垃圾回收器 | 堆内存 > 4 G 时推荐启用 |
java -Xms16G -Xmx16G -XX:+UseG1GC -jar ruoyi-admin.jar
三、项目构建: Maven 与 Nexus 制品库
3.1 Maven
Java 项目的构建工具,将源代码编译、测试、打包成可运行的 JAR 或 WAR 包
3.1.1 Maven 核心功能
- 管理依赖: 根据 pom.xml 文件声明项目所需的第三方库,自动从仓库下载
- 执行构建: 执行 编译 → 测试 → 打包,输出可部署的 JAR 或 WAR 包
3.1.2 pom.xml 核心配置
pom.xml 是 Maven 项目的工程文件,项目构建的入口定义文件
包含项目的名称、版本、依赖、构建配置等所有信息
| 配置项 | 用途 | 运维关注点 |
|---|---|---|
groupId/artifactId/version | 项目的唯一标识 | 确认部署的版本是否正确 |
packaging | jar 或 war | 确认不是方式 |
dependencies | 项目依赖的第三方库 | 了解项目引用的组件 |
profiles | 多环境构建配置 | 确认构建时使用正确的环境 |
3.1.3 Maven 命令
# 只编译,生成 .class 文件
mvn compile
# 编译 + 测试 + 打包
mvn package
# 清理旧文件 + 编译 + 测试 + 打包,生产推荐
mvn clean package
# 跳过测试,测试已由 CI 阶段完成
mvn clean package -DskipTests
3.2 制品与制品库
制品 (Artifact) : 软件构建过程中产生的可部署产物
制品库 (Artifact Repository) : 是集中存储和管理制品的地方
3.2.1 常见制品及制品库
| 制品类型 | 示例 | 制品库 |
|---|---|---|
| Java 制品 | .jar .war | Nexus / Artifactory |
| 前端制品 | .js .css .html | npm 仓库 / Nexus |
| 容器镜像 | Docker 镜像 | Docker Hub / Harbor / Nexus |
| 操作系统包 | .rpm .deb | RPM 仓库 / APT 仓库 / Nexus |
3.2.2 制品库作用
- 加速构建 : 依赖首次下载缓存到内网,后续内网主机从内网下载,速度远快于公网
- 统一管理 : 制品统一存储,版本可控
- 离线构建 : 内网主机无法连接外网,可以使用内网制品库
3.2.3 Nexus 的三种仓库
| 仓库类型 | 说明 | 存放内容 | 存入者 |
|---|---|---|---|
| 宿主仓库(Hosted) | 存放公司私有制品 | 公司开发构建的 JAR 包 | 开发人员 |
| 代理仓库(Proxy) | 存放公网下载的包 | 第三方依赖的库 | 构建时首次下载的缓存 |
| 仓库组(Group) | 合并上 2 者,提供一个统一的入口 | 不存放内容,只做转发 | 无 |
3.3 Nexus 部署与配置
3.3.1 部署环境
| 项目 | 示例配置 |
|---|---|
| 操作系统 | Rocky 10 |
| Java 版本 | JDK 21 |
| 内存 | 4G |
| 硬盘 | 60G |
# 配置主机名
hostnamectl set-hostname nexus
# 配置 DNS 解析,修改所有主机 hosts 解析记录
cat >> /etc/hosts << 'EOF'
10.0.0.161 nexus
EOF
# 配置 IP
nmcli connection modify eth0 ipv4.addresses 10.0.0.161/24
nmcli connection up eth0
3.3.2 部署 Nexus
# 安装 JDK
dnf install -y java-21-openjdk-headless
# 解压安装包
tar xf nexus-3.90.1-01-linux-x86_64.tar.gz -C /opt/
ln -s /opt/nexus-3.90.1-01/ /opt/nexus
# 创建专用用户,修改文件权限
useradd -r -s /sbin/nologin -c "Nexus Repository Service" nexus
chown -R nexus:nexus /opt/nexus
chown -R nexus:nexus /opt/sonatype-work/
# 修改启动脚本中的运行用户
vim /opt/nexus/bin/nexus
run_as_user='nexus'
# 修改 JVM 参数
vim /opt/nexus/bin/nexus.vmoptions
-Xms1024m
-Xmx1024m
-XX:MaxDirectMemorySize=2g
# 创建 Systemd 服务
tee /etc/systemd/system/nexus.service << 'EOF'
[Unit]
Description=Nexus Repository Manager
After=network.target
[Service]
Type=forking
User=nexus
Group=nexus
ExecStart=/opt/nexus/bin/nexus start
ExecStop=/opt/nexus/bin/nexus stop
Restart=on-abort
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
# 启动 Nexus
systemctl daemon-reload && systemctl enable --now nexus
# 验证
systemctl status nexus
ss -ntlp | grep 8081
ps aux | grep nexus
# Windows 添加解析记录
10.0.0.161 nexus.deng.org
# 浏览器访问,完成初始化配置
nexus.deng.org:8081
# 查看初始密码
cat /opt/sonatype-work/nexus3/admin.password


3.4 创建 Maven 私有仓库
3.4.1 创建 Blod Store (存储空间)


3.4.2 创建宿主仓库



3.4.3 创建代理仓库



3.4.4 创建仓库组


3.5 使用 Nexus 制品库
3.5.1 上传制品到 Nexus
在 ruoyi-java1 操作
3.5.1.1 配置 Maven settings.xml
获取 Nexus 制品库地址

vim ~/.m2/settings.xml
<settings>
<servers>
<server>
<id>ruoyi-releases</id>
<username>admin</username>
<password>12345678</password>
</server>
</servers>
<mirrors>
<mirror>
<id>nexus</id>
<name>Nexus Mirror</name>
<url>http://nexus.deng.org:8081/repository/maven-public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
</settings>

3.5.1.2 修改若依项目的 pom.xml
vim RuoYi-Vue/pom.xml
<distributionManagement>
<repository>
<id>ruoyi-releases</id>
<url>http://nexus.deng.org:8081/repository/ruoyi-releases/</url>
</repository>
</distributionManagement>


3.5.1.3 添加解析记录指向 Nexus 仓库
cat >> /etc/hosts << 'EOF'
10.0.0.161 nexus.deng.org
EOF
3.5.1.4 重新构建并上传
cd RuoYi-Vue/
mvn clean deploy -DskipTests
3.5.1.5 Nexus 查看制品信息


3.5.2 从 Nexus 获取制品并部署
在 ruoyi-java2 操作
获取制品地址

添加解析记录指向 Nexus 仓库
cat >> /etc/hosts << 'EOF'
10.0.0.161 nexus.deng.org
EOF
# 直接下载
wget http://nexus.deng.org:8081/repository/ruoyi-releases/com/ruoyi/ruoyi-admin/3.9.2/ruoyi-admin-3.9.2.jar
# Nexus 初始化时未开启匿名用户,下载需要用户名密码
wget --user="admin" --password="12345678" http://nexus.deng.org:8081/repository/ruoyi-releases/com/ruoyi/ruoyi-admin/3.9.2/ruoyi-admin-3.9.2.jar
# 部署到生产服务器
mv ruoyi-admin-3.9.2.jar /opt/ruoyi-vue/app/ruoyi-admin.jar
chmod -R 755 /opt/ruoyi-vue/app
chown -R ruoyi:ruoyi /opt/ruoyi-vue/app
systemctl restart ruoyi-vue
systemctl status ruoyi-vue
四、配置管理:Spring Boot多环境配置与Profile
通过不同的配置文件使同一个 Jar 包在开发、测试、生产环境运行
4.1 配置文件命名及加载顺序
- 主配置文件:
application.yml - 环境特定配置:
application-{profile}.yml
加载顺序: application.yml → application-{profile}.yml,启动时先加载 jar 内部配置文件,后加载外部配置文件
后加载的配置,相同配置项覆盖、不相同配置项叠加到主配置文件
4.2 若依项目配置文件
| 配置文件 | 作用 | 文件内容 |
|---|---|---|
application.yml | 主配置,通用配置,所有环境共享 | 应用名、端口、默认激活的 Profile |
application-druid.yml | 数据源配置,MySQL 连接池 | 数据库地址、用户名、密码、连接池大小 |
application-dev.yml | 开发环境配置 | 开发环境日志级别、调试开关 |
application-test.yml | 测试环境配置 | 测试环境日志级别、数据库地址 |
application-prod.yml | 生产环境配置 | 生产环境日志级别、性能参数 |
4.3 Profile 激活方式
4.3.1 方式一: 在 application.yml 中硬编码 (开发环境)
cat > /opt/ruoyi-vue/config/application.yml << 'EOF'
spring:
profiles:
active: prod,druid
EOF
4.3.2 方式二: 启动命令中指定
java -jar /opt/ruoyi-vue/app/ruoyi-admin.jar --spring.profiles.active=prod,druid
激活 JAR 包中包含的不同配置文件
4.3.3 方式三: 使用外部配置文件 (生产环境标准)
ExecStart=/usr/bin/java \
-jar /opt/ruoyi-vue/app/ruoyi-admin.jar \
--spring.config.additional-location=file:/opt/ruoyi-vue/config/ \ # 指定配置文件目录
--spring.profiles.active=prod,druid # 指定激活的环境配置
配置文件独立于 JAR 包,修改配置无需重新构建打包
敏感信息不打包在 JAR 包,更安全
可独立修改配置,更便捷
4.3.4 使用外部配置文件示例
# 创建外部配置文件指定监听端口
cat >> application-prod.yml << 'EOF'
server:
port: 8081
EOF
# 手动启动 jar 应用
java -jar /opt/ruoyi-vue/app/ruoyi-admin.jar \
--spring.config.additional-location=file:application-prod.yml \
--spring.profiles.active=prod,druid
# 查看应用监听端口
ss -ntlp
# 手动启动指定监听端口
java -jar /opt/ruoyi-vue/app/ruoyi-admin.jar --server.port=8081
ss -ntlp
4.3.5 --spring.profiles.active=prod,druid 解析
告诉Spring Boot同时加载 prod 和 druid 配置
application-prod.yml : 环境配置文件 (日志、端口等)
application-druid.yml : 数据库配置文件 (MySQL地址、账号、密码等)
正确组合: 一个环境 + 多个功能 配置文件
4.3.6 config.additional-location 和 profiles.active
config.additional-location : 指定配置文件路径
profiles.active : 指定激活的配置文件
两个参数配置使用
五、性能调优
针对 Tomcat + JVM 调优
5.1 调优参数配置位置
5.1.1 JAR 包
内置 Tomcat
| 调优对象 | 调优参数 | 配置位置 |
|---|---|---|
| Tomcat | 线程数、超时、队列 | application.yml |
| JVM | 堆内存、GC算法 | Systemd 服务文件中的 ExecStart (jar 启动参数) |
5.1.2 WAR 包
外置 Tomcat
| 调优对象 | 调优参数 | 配置位置 |
|---|---|---|
| Tomcat | 线程数、超时、队列 | server.xml |
| JVM | 堆内存、GC算法 | setenv.sh |
5.2 Tomcat 调优
5.2.1 线程池调优
| 调优参数 | 含义 | 默认值 | 生产建议 |
|---|---|---|---|
maxThreads | 最大工作线程数 | 200 | 4 核 200 - 300 , 8 核 400 - 600根据 CPU 核心数调整 |
minSpareThreads | 最小空闲线程数 | 10 | maxThreads 的 20% - 30% |
prestartminSpareThreads | 启动时预创建线程 | false | true (减少首次请求延迟) |
JAR 配置
vim /opt/ruoyi-vue/config/application-prod.yml
server:
tomcat:
# 核心工作线程数
threads:
# 最大工作线程
max: 200
min-spare: 40
# 等待队列容量,线程满了之后排队请求
accept-count: 100
# 连接超时
connection-timeout: 20000
# 最大连接数(同一时刻所有连接,区别于工作线程)
max-connections: 10000
WAR (外置Tomcat) 配置
<!-- conf/server.xml -->
<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="500"
minSpareThreads="100"
prestartminSpareThreads="true"/>
5.2.2 连接器调优
| 调优参数 | 含义 | 默认值 | 生产建议 |
|---|---|---|---|
| connectionTimeout | 连接超时 (毫秒) | 20000 | 10000 - 30000 |
| acceptCount | 等待队列长度 | 100 | maxThreads 的 50% - 100% |
| enableLookups | DNS 反向解析 | false | false (禁用,减少延迟) |
| compression | 启用压缩 | off | on (减少传输量) |
| compressionMinSize | 启用压缩最小文件大小 | 2048 |
JAR 配置
vim /opt/ruoyi-vue/config/application-prod.yml
server:
tomcat:
# 等待队列容量,线程满了之后排队请求
accept-count: 100
# 连接超时
connection-timeout: 20000
# 启用压缩
compression: on
# 压缩最小文件大小2KB
compression-min-size: 2048
WAR (外置Tomcat) 配置
<!-- conf/server.xml -->
<Connector port="8080"
connectionTimeout="20000"
acceptCount="200"
enableLookups="false"
compression="on"
compressionMinSize="2048"/>
5.2.3 I/O 模型
| 模型名称 | 配置方式 | 适用场景 | 性能 | 备注 |
|---|---|---|---|---|
| BIO | protocol="HTTP/1.1" | 低并发(<200连接) | 差 | |
| NIO | protocol="org.apache.coyote.http11.Http11NioProtocol" | 高并发 | 好 | 默认,一般不需要更改 |
| NIO2 | protocol="org.apache.coyote.http11.Http11Nio2Protocol" | 高并发 + 异步 | 好 | |
| APR | protocol="org.apache.coyote.http11.Http11AprProtocol" | 高并发 + 大量长连接 | 最好 | 需安装 native 库 |
生产环境大部分情况默认即可
# 查看 若依 当前使用的 I/O 模型
journalctl -u ruoyi-vue | grep ProtocolHandler
JAR 配置
server:
tomcat:
protocol: org.apache.coyote.http11.Http11Nio2Protocol
WAR (外置Tomcat) 配置
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"/>
5.3 JVM 调优
5.3.1 JVM 内存调优
| 调优项 | 含义 | 生产建议 |
|---|---|---|
-Xms | 初始堆内存大小 | 和 -Xmx 设相同值,避免动态扩容抖动 |
-Xmx | 最大堆内存大小 | 物理内存的 50% - 70% |
-XX:MetaspaceSize | 元空间初始大小 | 256m |
-XX:MaxMetaspaceSize | 元空间最大大小 | 512m |
-XX:+UseG1GC | 使用 G1 垃圾回收器 | 低延迟场景推荐 |
-XX:MaxGCPauseMillis=200 | GC 最大暂停时间 | 200ms,让 GC 暂停时间可控 |
JAR 配置
vim /etc/systemd/system/ruoyi-vue.service
ExecStart=/usr/bin/java \
-Xms1g -Xmx1g \
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \ # 当堆内存溢出时记录转储日志
-XX:HeapDumpPath=/opt/ruoyi-vue/logs/heapdump.hprof \ # 转储日志文件路径
WAR 配置
vim /usr/local/tomcat/bin/setenv.sh
export CATALINA_OPTS="-Xms4g -Xmx4g"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+PrintGCDetails -Xloggc:/usr/local/tomcat/logs/gc.log"
5.3.2 垃圾回收 (GC) 调优
目前推荐的垃圾回收器:
- G1 : 生产环境主流,适用 6 - 64 GB 堆内存大小,暂停时间 100 - 200 ms
- ZGC : JDK 17 版本以上, > 64 GB 堆内存大小推荐,暂停时间 < 10 ms,但会带来更高的 CPU 开销
| 调优项 | 含义 | 生产建议 | 备注 |
|---|---|---|---|
-XX:+UseG1GC | 使用 G1 垃圾回收器 | ||
-XX:MaxGCPauseMillis=200 | GC 最大暂停时间 | 200ms | |
-XX:G1HeapRegionSize=16m | G1分区大小 | 16m 或 32m | G1 回收器专用,堆内存 ≥ 16G时推荐 |
-XX:InitiatingHeapOccupancyPercent=45 | 堆内存使用率达到45% 启动GC | 45 - 60 | 默认 45,G1 回收器专用 |
JAR 配置
-Xms4g -Xmx4g \
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 \
-XX:G1HeapRegionSize=16m \
-XX:InitiatingHeapOccupancyPercent=45 \
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/ruoyi/gc.log # GC 日志,注意JDK 11 +改用新配置方式
5.4 JVM 诊断命令
需要安装 openjdk-devel
dnf install -y java-21-openjdk-devel
5.4.1 jps 查看 java 进程
# 查看所有 java 进程
jps -l
5.4.2 jstat 实时查看 GC 情况
jstat -gcutil 968 1s 5
S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT
- 100.00 52.22 8.24 99.04 96.65 12 0.323 0 0.000 6 0.009 0.332
- 100.00 52.22 8.24 99.04 96.65 12 0.323 0 0.000 6 0.009 0.332
- 100.00 52.22 8.24 99.04 96.65 12 0.323 0 0.000 6 0.009 0.332
- 100.00 52.22 8.24 99.04 96.65 12 0.323 0 0.000 6 0.009 0.332
- 100.00 52.22 8.24 99.04 96.65 12 0.323 0 0.000 6 0.009 0.332
重点关注字段
| 字段 | 含义 | 正常值 | 异常值 |
|---|---|---|---|
| O | 老年代使用率 | < 70% | 接近 100% ,内存不够 |
| FGC | Full GC 次数 | 极少 | 频繁增长,内存泄漏、巨型对象、堆空间不足 |
5.4.3 jhsdb 查看堆内存配置
jhsdb jmap --heap --pid 968
5.5 调优效果验证
# 查看 JVM 调优参数
ps -ef | grep java | grep ruoyi-admin.jar
# 查看 GC 情况
jstat -gcutil $(jps -l | grep ruoyi-admin.jar | awk '{print $1}') 2s 5
# 查看堆内存配置 (JDK 8)
jmap -heap $(jps -l | grep ruoyi-admin.jar | awk '{print $1}')
# 查看堆内存配置 (JDK 11+)
jhsdb jmap --heap --pid $(jps -l | grep ruoyi-admin.jar | awk '{print $1}')
5.6 Tomcat与数据库连接池
Tomcat 线程数 (server.tomcat.threads.max) 和数据库连接池大小 (spring.datasource.druid.maxActive) 需要匹配
spring.datasource.druid.maxActive 推荐值与 MySQL 允许的最大连接数和关联的应用实例数量相关,结合生产实际调整
六、Actuator 应用观测
6.1 Actuator 功能
- 应用存活状态 (
/health) - JVM 内存使用量、GC次数 (
/metrics) - 制品的日志级别,支持动态调整 (
/loggers) - 堆内存快照,用于分享内存泄漏 (
/headdump)
6.2 示例: 若依配置 Actuator
6.2.1 pom.xml 添加依赖
cd RuoYi-Vue
vim ruoyi-admin/pom.xml
<dependencies> <!-- 在该字段下方添加 -->
<!-- Spring Boot Actuator 监控依赖 -->
<!-- 提供生产级别的应用监控和管理功能,包括健康检查、指标收集、环境信息等端点 -->
<!-- 版本由 spring-boot-starter-parent 统一管理,无需显式指定 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<!--有可能需要增加版本 <version>2.7.18</version> -->
</dependency>
6.2.2 配置 application.yml
配置项解析
| 配置项 | 说明 | 推荐值 |
|---|---|---|
management.endpoints.web.base-path | Actuator端点的访问路径前缀 | /actuator (默认) |
management.endpoints.web.exposure.include | 暴露的端点 | 生产环境: health,info,metrics,/loggers |
management.endpoint.health.show-details | 健康检查是否显示详情 | always |
vim /opt/ruoyi-vue/config/application-prod.yml
management:
server:
# 独立端口,不和业务8080混在一起
port: 9090
# 绑定内网网卡固定IP
address: 10.0.0.10
endpoints:
web:
exposure:
# 暴露所有端点
include: '*'
endpoint:
health:
# 显示详细信息
show-details: always
metrics:
# 启用 metrics
enabled: true
heapdump:
# 启用 heapdump
enabled: true
6.2.3 放行鉴权
在 ruoyi-framework 模块的 SecurityConfig.java 中,添加放行规则
vim ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
.requestMatchers("/actuator/**").permitAll()
// 除上面外的所有请求全部需要鉴权认证 # 在此行上方添加放行/actuator/** 路径
.anyRequest().authenticated();
6.2.4 重新打包并重启
# 重新打包
mvn clean package -DskipTests
# 部署 jar 包
cp ruoyi-admin/target/ruoyi-admin.jar /opt/ruoyi-vue/app/
# 重启
systemctl restart ruoyi-vue
# 部署到扩容节点
scp 10.0.0.111:/root/RuoYi-Vue/ruoyi-admin/target/ruoyi-admin.jar /opt/ruoyi-vue/app/
scp 10.0.0.111:/opt/ruoyi-vue/config/application-prod.yml /opt/ruoyi-vue/config/application-prod.yml
systemctl restart ruoyi-vue
# 验证
curl http://localhost:8080/actuator/health | jq
6.3 核心端点解析
6.3.1 /health 健康检查
curl http://localhost:8080/actuator/health | jq
{
"components": {
"db": {
"components": {
"dynamicDataSource": {
"components": {
"MASTER": {
"details": {
"database": "MySQL",
"validationQuery": "isValid()"
},
"status": "UP" # UP 表示 数据库连接正常
}
},
"status": "UP"
},
"masterDataSource": {
"details": {
"database": "MySQL",
"validationQuery": "isValid()"
},
"status": "UP"
}
},
"status": "UP"
},
"diskSpace": {
"details": {
"total": 40324038656,
"free": 37088055296,
"threshold": 10485760,
"path": "/opt/ruoyi-vue/.",
"exists": true
},
"status": "UP" # UP 表示 磁盘空间充足
},
"livenessState": {
"status": "UP"
},
"ping": {
"status": "UP"
},
"readinessState": {
"status": "UP"
},
"redis": {
"details": {
"version": "8.10.0"
},
"status": "UP" # UP 表示 Redis 连接正常
},
"ssl": {
"details": {
"expiringChains": [],
"invalidChains": [],
"validChains": []
},
"status": "UP"
}
},
"groups": [
"liveness",
"readiness"
],
"status": "UP"
6.3.2 /metrics 性能指标
# 列出所有可查看的指标
curl http://localhost:8080/actuator/metrics | jq
6.3.3 /loggers 动态日志
# 查看当前日志级别
curl http://localhost:8080/actuator/loggers/com.ruoyi
# 临时调整日志级别为 DEBUG
curl -X POST http://localhost:8080/actuator/loggers/com.ruoyi -H "Content-Type: application/json" -d '{"configuredLevel": "DEBUG"}'
# 验证调整日志级别是否生效
curl http://localhost:8080/actuator/loggers/com.ruoyi
# 恢复日志级别为 INFO
curl -X POST http://localhost:8080/actuator/loggers/com.ruoyi -H "Content-Type: application/json" -d '{"configuredLevel": null}'
# 验证调整日志级别是否生效
curl http://localhost:8080/actuator/loggers/com.ruoyi
生产环境使用日志排障流程:
临时调整志级别为 DEBUG → 复现问题 → 收集日志 → 恢复日志级别为 INFO → 分析日志
6.3.4 /heapdump 堆内存快照
# 导出堆内存快照
curl -o /tmp/heap.hprof http://localhost:8080/actuator/heapdump
使用场景:
- 应用频繁 Full GC
- 怀疑有内存泄漏
- 分析占用内存最多的对象
分析工具: Eclipse MAT , VisualVM , JProfiler
6.4 生产环境安全配置
6.4.1 端口暴露配置
| 端点 | 是否暴露 | 原因 |
|---|---|---|
/health | 是 | Nginx / K8s 健康检查需要 |
/info | 是 | 查看版本信息 |
/metrics | 内网或认证 | 查看敏感性能指标 |
/loggers | 内网或认证 | 可动态修改日志级别 |
/heapdump | 否 | 可下载堆内存快照 |
/env | 否 | 暴露数据库配置等敏感配置参数 |
/shutdown | 否 | 可关闭应用 |
6.4.2 生产环境推荐配置
management:
server:
# 独立端口,不和业务8080混在一起
port: 9090
# 绑定内网网卡固定IP
address: 10.0.0.111
endpoints:
web:
exposure:
# 暴露所有端点
include: health,info,metrics
endpoint:
health:
# 显示详细信息
show-details: always
metrics:
# 启用 metrics
enabled: true
# 访问方式
curl http://10.0.0.111:9099/actuator/health
6.4.3 配合 Prometheus/Grafana
management:
endpoints:
web:
exposure:
include: health,info,prometheus
# Prometheus 采集端点
curl http://10.0.0.111:9099/actuator/prometheus

1330

被折叠的 条评论
为什么被折叠?



