提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- [1. 项目部署](#1. 项目部署)
-
- [1.1 nacos上的项目配置](#1.1 nacos上的项目配置)
- [1.2 其他组件的docker-compose](#1.2 其他组件的docker-compose)
- [1.3 后端打包](#1.3 后端打包)
- [1.4 组件之间依赖关系](#1.4 组件之间依赖关系)
- [1.5 nginx配置](#1.5 nginx配置)
- [1.6 docker一些命令](#1.6 docker一些命令)
- [1.7 修改](#1.7 修改)
- [1.8 第二台机器](#1.8 第二台机器)
- [1.9 测试](#1.9 测试)
- [1.10 纠错](#1.10 纠错)
- 总结
前言
1. 项目部署
1.1 nacos上的项目配置
http://192.168.56.107:8848/nacos/就可以了
其中192.168.56.107是公网,外网
一开始会先进入登录页面
默认密码是nacos和nacos

这里可以修改密码
java
username: nacos
password: nacosckoj_8

然后是创建命令空间
java
```java
spring:
application:
name: oj-gateway
profiles:
active: local
cloud:
nacos:
discovery:
namespace: 7c56d49e-a3b9-41e7-b779-2eccb84c27ec
server-addr: http://你安装nacos的云服务器内网ip:8848
username: nacos
password: nacosckoj_8
ip: ${HOST_IP}
config:
namespace: 7c56d49e-a3b9-41e7-b779-2eccb84c27ec
server-addr: http://你安装nacos的云服务器内网ip:8848
file-extension: yaml
username: nacos
password: nacosckoj_8
然后是修改bootstrap.yml
其中内网ip可以在阿里云的控制台查询到,外网ip也可以查询到,但是在浏览器上用nacos就要用外网ip了
因为我用的是本地的ubuntu,所以就是192.168.56.107了
java
spring:
application:
name: oj-gateway
profiles:
active: local
cloud:
nacos:
discovery:
namespace: 7c56d49e-a3b9-41e7-b779-2eccb84c27ec
server-addr: http://192.168.56.107:8848
username: nacos
password: nacosckoj_8
ip: ${HOST_IP}
config:
namespace: 7c56d49e-a3b9-41e7-b779-2eccb84c27ec
server-addr: http://192.168.56.107:8848
file-extension: yaml
username: nacos
password: nacosckoj_8
记得其他的微服务也要改
因为java的程序都是在一台服务器上跑的,所以可以用内网ip来相互访问的
但是浏览器访问nacos是不能用内网ip的,因为服务器的内网是在阿里云那边的
但是我们的浏览器不在阿里云那边
然后是nacos上面的配置了
java
server:
port: 9201
spring:
data:
redis:
host: 192.168.56.107
password: 123456
datasource:
url: jdbc:mysql://192.168.56.107:3306/ckoj_dev?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8
username: ojtest
password: 123456
hikari:
minimum-idle: 5 # 最⼩空闲连接数
maximum-pool-size: 20 # 最⼤连接数
idle-timeout: 30000 # 空闲连接存活时间(毫秒)
connection-timeout: 30000 # 连接超时时间(毫秒)
elasticsearch:
uris: http://192.168.56.107:9200
jwt:
secret: zxcvbnmasdfghjkl

直接复制以前的就可以了,然后把ip改为内网ip,或者公网ip
java
server:
port: 9204
spring:
rabbitmq:
host: 192.168.56.108
port: 5672
username: admin
password: admin
datasource:
url: jdbc:mysql://192.168.56.108:3306/ckoj_dev?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8
username: ojtest
password: 123456
hikari:
minimum-idle: 5 # 最⼩空闲连接数
maximum-pool-size: 20 # 最⼤连接数
idle-timeout: 30000 # 空闲连接存活时间(毫秒)
connection-timeout: 30000 # 连接超时时间(毫秒)
jwt:
secret: zxcvbnmasdfghjkl
sandbox:
docker:
host: tcp://172.17.0.1:2375
limit:
memmory: 100000000
memory-swap: 100000000
cpu: 1
time: 5
注意docker这里我们要用docker0的ip
http://192.168.56.107/是我的内网ip,我这个只有内网ip
1.2 其他组件的docker-compose
因为这些组件之间得到依赖性不强了,所以一起搞
java
oj-xxl-job-server:
container_name: oj-xxl-job-server
image: xuxueli/xxl-job-admin:2.4.0
# 设置连接MySQL的URL、用户名和密码等配置。
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://oj-mysql-server:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
- SPRING_DATASOURCE_USERNAME=ojtest
- SPRING_DATASOURCE_PASSWORD=123456
# 假设xxl-job监听在8080端口
ports:
- "8080:8080"
# 依赖于 oj-mysql-server 服务,并在其状态为健康时启动。
depends_on:
oj-mysql-server:
condition: service_healthy
oj-redis-server:
container_name: oj-redis-server
image: redis:latest
ports:
- "6379:6379"
volumes:
- ./redis/data:/data
# 设置 Redis 的访问密码。
environment:
REQUIREPASS: 123456
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 10s
timeout: 5s
retries: 10
oj-gateway:
image: ck/oj-gateway:0.0.1-SNAPSHOT
# 提供了构建上下文的路径。这意味着Docker将在./bitoj-jar/gateway/目录中寻找构建所需的文件。
build:
context: ./ckoj-jar/gateway/
container_name: oj-gateway
environment:
# 时区上海
TZ: Asia/Shanghai
HOST_IP: 192.168.56.107
ports:
- "19090:19090"
privileged: true
depends_on:
oj-nacos-server:
condition: service_healthy
oj-redis-server:
condition: service_healthy
oj-nginx-server:
# 使用 nginx:1.21 镜像。
image: nginx:1.21
# 容器名称为 oj-nginx-server
container_name: oj-nginx-server
volumes:
# 配置文件挂载
- ./nginx/conf/default.conf:/etc/nginx/conf.d/default.conf
# 前端项目部署核心步骤。这可以用于将一些静态资源(如网页、文件、图片等)从本地主机挂载到容器中,供 Nginx 进行服务。
- ./nginx/dist:/home/dist
environment:
# 时区上海
TZ: Asia/Shanghai
# 端口映射
ports:
- "80:80"
- "10030:10030"
- "443:443"
privileged: true
# 表示此服务依赖于 oj-gateway 服务,即 oj-gateway 服务启动后才会启动此服务。
depends_on:
- oj-gateway
oj-elasticsearch-server:
container_name: oj-elasticsearch-server
image: elasticsearch:8.5.3
ports:
- "9200:9200"
# 挂载本地目录用于存储 Elasticsearch的数据、插件。
volumes:
- ./elasticsearch/es-plugins:/usr/share/elasticsearch/plugins
# 设置为单节点模式,并限制 Java 虚拟机的内存使用。暂时禁用了Elasticsearch的安全特性
environment:
discovery.type: single-node
ES_JAVA_OPTS: "-Xms256m -Xmx256m"
xpack.security.enabled: false
# 通过执行 curl 命令检查 Elasticsearch 的集群健康状态。
healthcheck:
test: [ "CMD", "curl", "-s", "http://localhost:9200/_cluster/health?wait_for_status=green&timeout=1s" ]
interval: 30s
timeout: 5s
retries: 10
oj-kibana-server:
image: kibana:8.5.3
container_name: oj-kibana-server
ports:
- "10010:5601"
# 依赖于 oj-elasticsearch-server 服务,并在其健康时启动。
depends_on:
oj-elasticsearch-server:
condition: service_healthy
# 设置系统语言为中文,并指定连接到 Elasticsearch 的 URL
environment:
I18N_LOCALE: zh-CN
ELASTICSEARCH_URL: http://elasticsearch:9200
oj-rabbitMQ-server:
container_name: oj-rabbitMQ-server
image: rabbitmq:3.8.30-management
ports:
- "5672:5672"
- "10020:15672"
volumes:
- ./rabbit/data:/var/lib/rabbitmq
# 设置 RabbitMQ 的默认用户名和密码。
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: admin
healthcheck:
test: [ "CMD", "rabbitmqctl", "status" ]
interval: 30s
timeout: 10s
retries: 10
oj-system:
image: ck/oj-system:0.0.1-SNAPSHOT
build:
context: ./ckoj-jar/system/
container_name: oj-system
environment:
# 时区上海
TZ: Asia/Shanghai
HOST_IP: 192.168.56.107
ports:
- "9201:9201"
privileged: true
depends_on:
oj-nacos-server:
condition: service_healthy
oj-redis-server:
condition: service_healthy
oj-elasticsearch-server:
condition: service_healthy
oj-friend:
image: ck/oj-friend:0.0.1-SNAPSHOT
build:
context: ./ckoj-jar/friend/
container_name: oj-friend
environment:
# 时区上海
TZ: Asia/Shanghai
HOST_IP: 192.168.56.107
ports:
- "9202:9202"
privileged: true
depends_on:
oj-nacos-server:
condition: service_healthy
oj-redis-server:
condition: service_healthy
oj-elasticsearch-server:
condition: service_healthy
oj-rabbitMQ-server:
condition: service_healthy
oj-job:
image: ck/oj-job:0.0.1-SNAPSHOT
build:
context: ./ckoj-jar/job/
container_name: oj-job
environment:
# 时区上海
TZ: Asia/Shanghai
HOST_IP: 192.168.56.107
ports:
- "9203:9203"
privileged: true
depends_on:
oj-nacos-server:
condition: service_healthy
oj-redis-server:
condition: service_healthy
oj-judge:
image: ck/oj-judge:0.0.1-SNAPSHOT
build:
context: ./ckoj-jar/judge/
container_name: oj-judge
# 将本地目录挂载到容器内的用户代码存储目录
volumes:
- /user-code-pool:/user-code-pool
environment:
# 时区上海
TZ: Asia/Shanghai
HOST_IP: 192.168.56.107
privileged: true
depends_on:
oj-nacos-server:
condition: service_healthy
oj-rabbitMQ-server:
condition: service_healthy
gateway的HOST_IP应该为http://192.168.56.107/
这里bootstrap里面的${HOST_IP}指的是环境变量里面的ip
java
environment:
# 时区上海
TZ: Asia/Shanghai
HOST_IP: 服务所在云服务器内网IP
就是这里配置的环境变量
所有的微服务都要配置HOST_IP
java
depends_on:
oj-nacos-server:
condition: service_healthy
oj-redis-server:
condition: service_healthy
然后是gateway的依赖项有多个,依赖redis和nacos
java
- ./nginx/conf/default.conf:/etc/nginx/conf.d/default.conf
- ./nginx/dist:/home/dist
然后是nginx,有这个配置文件
静态资源也是用的这个
java
volumes:
- ./elasticsearch/es-plugins:/usr/share/elasticsearch/plugins
然后是es,我们挂载的是插件
因为有个分词器要挂载上去
es的鉴权现在暂时不打开
java
image: ck/oj-gateway:0.0.1-SNAPSHOT

build是镜像的来源
1.3 后端打包
java
mvn clean package -DskipTests
安装成功以后,关闭idea,重新启动,因为可能没有反应过来已经更新了path
然后在idea的控制台执行mvn clean package -DskipTests就可以了
这样就成功了
然后就可以执行脚本了
java
#rm ../ckoj-jar/gateway/oj-gateway.jar
#rm ../ckoj-jar/friend/oj-friend.jar
#rm ../ckoj-jar/job/oj-job.jar
#rm ../ckoj-jar/judge/oj-judge.jar
#rm ../ckoj-jar/system/oj-system.jar
copy ../../../oj-gateway/target/oj-gateway-1.0-SNAPSHOT.jar ../ckoj-jar/gateway/oj-gateway.jar
copy ../../../oj-modules/oj-judge/target/oj-judge-1.0-SNAPSHOT.jar ../ckoj-jar/judge/oj-judge.jar
copy ../../../oj-modules/oj-friend/target/oj-friend-1.0-SNAPSHOT.jar ../ckoj-jar/friend/oj-friend.jar
copy ../../../oj-modules/oj-job/target/oj-job-1.0-SNAPSHOT.jar ../ckoj-jar/job/oj-job.jar
copy ../../../oj-modules/oj-system/target/oj-system-1.0-SNAPSHOT.jar ../ckoj-jar/system/oj-system.jar
pause
我们用powershell来执行脚本
直接搜索就可以打开了
java
cd D:\spring-project\ck-oj\deploy\test\sh
.\copy.ps1

出现这个按enter就成功了
如果只有组件,我们是可以docker compose up -d,直接拉取镜像
但是有了微服务的话,就不可以了,是因为镜像这一块,因为mysql和nacos镜像不是我们自定义的,不需要构建这两个镜像的,但是这些微服务的镜像我们是没有的,所以要先构建这些微服务的镜像才可以构建容器
先用docker compose build来构建镜像---》java服务
java
docker compose build
直接这个命令,然后就可以根据docker compose .yml来构建镜像了
然后是
java
docker compose up -d
1.4 组件之间依赖关系
1.5 nginx配置
然后是nginx的配置,比如服务器组的配置
java
upstream ckoj {
server 你的云服务器1内网IP:19090;
server 你的云服务器2内网IP:19090;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /home/dist/oj-fe-c/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /dev-api/ {
proxy_pass http://ckoj/friend/;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
server {
listen 10030;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /home/dist/oj-fe-b/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /dev-api/ {
proxy_pass http://ckoj/system/;
}
}
upstream 中配置服务器组的时候均使⽤服务器的内⽹ip。
在 server 块中配置了两个端⼝的监听:80 和 10030。因为我们有 B 端和 C 端,有各⾃不同的静态资源和动态资源,所以需要分别监听这两个端⼝。
root /home/dist/oj-fe-c/dist : 这段配置指定静态资源的⽬录。这⾥所说的静态资源正是我们前⾯讲nginx 动静分离时提到的静态资源。
upstream配置的是服务器组,后面跟的是网关的端口号
为什么配置两个server呢,因为有b端和c端
b端是10030端口号
c端是80端口号
java
location /dev-api/ {
proxy_pass http://ckoj/friend/;
}
这个就是代理,请求以/dev-api/开头就代理到http://ckoj/friend/
java
location / {
root /home/dist/oj-fe-c/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
try_files uri uri/ /index.html; : 由于我们的前端应⽤是⽤Vue开发的单⻚⾯应⽤(SPA),并使⽤客⼾端路由来管理⻚⾯的不同状态和视图。然⽽,服务器并不识别这些前端路由,只会处理来⾃客⼾端的URL请求,这可能导致404错误。通过添加这段配置,⽆论⽤⼾请求的路径是什么,最终都会被导向SPA的 index.html ⽂件。这个⽂件通常是SPA的⼊⼝点。index.html 就是我们前端项目的入口点
挂载的话,自己写了容器就会同步我们写的,我们没有写,就会去同步容器的数据
1.6 docker一些命令
java
docker images
docker rmi -f 镜像ID或名称:标签
docker ps -a
# 先停止容器(若运行中)
docker stop 容器ID或名称
docker rm 容器ID或名称
docker rm -f 容器ID或名称 # 无需先停止,直接删除
docker logs 容器ID或名称 # 看日志
docker compose build
docker compose up -d
docker compose down
docker restart id重新启动容器
docker compose down 是 Docker Compose 的一个命令,用于停止并删除当前 Docker Compose 管理的所有容器
它的主要作用是:
停止所有通过 docker compose up 启动的容器
删除这些已停止的容器
删除由 Compose 创建的自定义网络(默认不会删除宿主机的默认网络)
可选删除相关的卷(需加 -v 或 --volumes 参数)
可选删除构建的镜像(需加 --rmi all 或 --rmi local 参数)
常用场景:
想彻底清理当前 Compose 项目的运行环境时使用
对 docker-compose.yml 配置文件做了重大修改后,需要重新部署时使用
镜像一般是最干净的,容器才是受docker-compose.yml污染的
除非我们用jar包创建的容器有错
所以docker compose build
可以不用多次执行,除非jar包有问题
docker compose build 的核心作用是:根据当前目录下 docker-compose.yml 文件中定义的配置,为所有指定了 build 上下文的服务构建本地 Docker 镜像。
它主要解决的问题是"批量构建镜像",避免了手动为每个服务执行 docker build 命令的繁琐操作,具体包含以下关键行为:
- 自动识别 docker-compose.yml 中每个服务的 build 配置(如 Dockerfile 路径、构建参数等)。
- 按配置顺序(或依赖关系)为多个服务并行/串行构建镜像,构建完成的镜像会自动关联到对应的服务。
- 支持增量构建:若服务的代码、Dockerfile 未修改,会复用之前的构建缓存,加快构建速度。
如果已经有了这个镜像呢,还会构建吗
默认情况下不会重新完整构建,会优先使用构建缓存来加速过程,只有当触发缓存失效的条件时,才会重新构建变化的部分。
具体逻辑如下:
- 检查缓存有效性:Docker 会对比服务的 build 上下文(如代码、依赖文件)和 Dockerfile 的内容。若所有文件均未修改,且构建参数( args )等配置也无变化,则直接复用现有镜像层,不进行新构建。
- 缓存失效则增量构建:若 Dockerfile 指令(如 COPY 、 RUN )或上下文文件有修改,会从修改指令的那一层开始重新构建,未修改的底层仍复用缓存,而非完全重建整个镜像。
- 强制全量构建:若需忽略缓存、强制重新构建所有层,可在命令后加 --no-cache 参数,即 docker compose build --no-cache 。
1.7 修改
修改一些小bug,导致不成功

第一我们docker-compose.yml文件里面写的是小写s

第二,没有把ik分词器传进去

第三elasticsearch是和dotasource同级的配置
1.8 第二台机器
java
# 指定 Docker Compose ⽂件的版本
#version: '3.8'
#services:定义了服务列表
services:
oj-gateway:
image: ck/oj-gateway:0.0.1-SNAPSHOT
# 提供了构建上下文的路径。这意味着Docker将在./bitoj-jar/gateway/目录中寻找构建所需的文件。
build:
context: ./ckoj-jar/gateway/
container_name: oj-gateway
environment:
# 时区上海
TZ: Asia/Shanghai
HOST_IP: 192.168.56.108
ports:
- "19090:19090"
privileged: true
oj-system:
image: ck/oj-system:0.0.1-SNAPSHOT
build:
context: ./ckoj-jar/system/
container_name: oj-system
environment:
# 时区上海
TZ: Asia/Shanghai
HOST_IP: 192.168.56.108
ports:
- "9201:9201"
privileged: true
oj-friend:
image: ck/oj-friend:0.0.1-SNAPSHOT
build:
context: ./ckoj-jar/friend/
container_name: oj-friend
environment:
# 时区上海
TZ: Asia/Shanghai
HOST_IP: 192.168.56.108
ports:
- "9202:9202"
privileged: true
oj-job:
image: ck/oj-job:0.0.1-SNAPSHOT
build:
context: ./ckoj-jar/job/
container_name: oj-job
environment:
# 时区上海
TZ: Asia/Shanghai
HOST_IP: 192.168.56.108
ports:
- "9203:9203"
privileged: true
oj-judge:
image: ck/oj-judge:0.0.1-SNAPSHOT
build:
context: ./ckoj-jar/judge/
container_name: oj-judge
# 将本地目录挂载到容器内的用户代码存储目录
volumes:
- /user-code-pool:/user-code-pool
environment:
# 时区上海
TZ: Asia/Shanghai
HOST_IP: 192.168.56.108
privileged: true
先是docker-compose.yml文件,直接复制以前的就可以了,然后去掉depends on
因为第一台机器的依赖项已经启动成功
然后是HOST_IP也要改,HOST_IP是环境变量
java
cloud:
nacos:
discovery:
namespace: 7c56d49e-a3b9-41e7-b779-2eccb84c27ec
server-addr: http://192.168.56.107:8848
username: nacos
password: nacosckoj_8
ip: ${HOST_IP}
会在bootstrap.yml里面用到,这个的意思是指定gateway微服务的jar所在服务器的地址
第二台虚拟机我们就只需要这两个文件就可以了,只部署虚拟机,不部署组件
但是docker-compose.yml名字改变了
java
docker compose -f docker-compose2.yml build
docker compose -f docker-compose2.yml up -d
这样就可以了
1.9 测试
访问http://192.168.56.107:10030/就可以访问b端接口了
但是我们要新添加一个管理员用户
我们是有添加管理员用户的接口的---》给网关添加白名单
测试一下但是报错了
我们用docker logs id
就可以查看了
所以我们直接在数据库添加吧
java
@Override
public int add(SysUserSaveDTO saveDTO) {
List<SysUser> sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserAccount, saveDTO.getUserAccount()));
if(CollectionUtil.isNotEmpty(sysUsers)){
throw new ServiceException(ResultCode.AILED_USER_EXISTS);
}
SysUser sysUser = new SysUser();
sysUser.setUserAccount(saveDTO.getUserAccount());
sysUser.setPassword(BCryptUtils.encryptPassword(saveDTO.getPassword()));
sysUser.setCreateBy(Constants.SYSTEM_USER_ID);
return sysUserMapper.insert(sysUser);
}
或者我们设置一个系统用户
然后又要重新打包了
但是这次只用重新搞system的jar包了
只用重新启动system,重新部署system
java
docker compose up -d oj-nacos-server
指定部署的服务名
所以构建build的时候也是可以指定的
java
docker compose build oj-system
注意这个build是要有build参数的,是我们需要自己创建镜像的,是需要dockerfile的,没有的话,就不会执行,默认有的镜像就不会build了
java
services:
oj-mysql-server:
其中这个oj-system就是services下一级的名字
java
docker compose build oj-system
docker compose up -d oj-system
docker compose -f docker-compose2.yml build oj-system
docker compose -f docker-compose2.yml up -d oj-system
这样就成功了
http://192.168.56.107:80就可以进入c端了
1.10 纠错
有一些错误
比如nacos上面judge配置的Rabbitmq和mysql的地址,我写的192.168.56.108,其实应该是192.168.56.107
还有一个问题就是
,问题依然是 rabbit_disk_monitor 进程因 df 命令超时反复崩溃,且之前的配置优化未生效 ------ 核心原因是 旧版本 RabbitMQ(3.8.x)与你的 Docker 环境存在底层文件系统交互障碍,常规配置调整无法解决
就是说RabbitMQ(3.8.x)与你的 Docker 环境存在底层文件系统交互障碍,会报错的
java
oj-rabbitMQ-server:
container_name: oj-rabbitMQ-server
image: rabbitmq:3.9.13-management
ports:
- "5672:5672"
- "10020:15672"
volumes:
- ./rabbit/data:/var/lib/rabbitmq
# 设置 RabbitMQ 的默认用户名和密码。
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: admin
healthcheck:
test: [ "CMD", "rabbitmqctl", "status" ]
interval: 30s
timeout: 10s
retries: 10
所以我们更换Rabbitmq的版本为3.9.13
你的当前镜像版本是 3.8.30,而 RabbitMQ 在 3.9 版本 中对「磁盘监控模块」进行了 底层重构,彻底解决了旧版本(3.8.x 及更早)依赖 df 命令导致的超时崩溃问题 ------ 这正是你当前遇到的核心痛点。
这样就可以了

这样以后就成功了