在 2 核 2G(2GB 内存)的服务器上运行 Ruoyi-Cloud(基于 Spring Cloud 的微服务架构)是一个极具挑战性的场景。Spring Cloud 默认配置通常是为更高配置的服务器设计的,直接运行极易触发 OOM(Out Of Memory)或系统频繁 Swap 导致卡死。
要在此类低配环境下成功运行,必须对JVM 参数、微服务组件、数据库以及中间件进行全方位的“瘦身”和精简。以下是具体的优化方案:
1. 核心策略:精简微服务架构(最关键)
Ruoyi-Cloud 包含十几个微服务(如 ruoyi-admin, ruoyi-gateway, ruoyi-auth, ruoyi-system, ruoyi-job 等)。在 2G 内存下,全量启动几乎是不可能的。
-
方案 A:单体化部署(推荐)
- 将
ruoyi-common模块提取出来,把ruoyi-system、ruoyi-auth、ruoyi-job等核心业务逻辑合并到一个 Jar 包中。 - 去掉 Nacos/Eureka 注册中心依赖,使用本地配置。
- 去掉 Gateway 网关层,直接在 Controller 层处理请求(或者只保留最基础的鉴权)。
- 效果:内存占用可从 1.5GB+ 降至 600MB-800MB,留出空间给数据库和 Redis。
- 将
-
方案 B:按需启动(如果必须保留微服务)
- 只启动最核心的服务:
ruoyi-admin(后端核心) +ruoyi-auth(认证)。 - 暂时关闭非核心服务:
ruoyi-gateway(可改为 Nginx 反向X_X),ruoyi-quartz/job(手动调度),ruoyi-monitor(监控)。 - 注意:Nacos Server 本身非常吃内存(建议至少 1G),如果必须用 Nacos,建议将其迁移到另一台机器,或者改用轻量级的 Eureka(已停止维护但极轻)或 Consul,甚至直接用硬编码 IP 调用(不推荐生产环境)。
- 只启动最核心的服务:
2. JVM 参数调优
无论采用哪种架构,必须强制限制每个 Java 进程的堆内存。默认的 -Xmx 通常是物理内存的 1/4 或更多,这在 2G 机器上是致命的。
修改所有服务的启动脚本(startup.sh 或 pom.xml 中的 Maven 插件配置),添加以下参数:
# 关键参数说明
-Xms512m # 初始堆大小设为 512MB
-Xmx512m # 最大堆大小严格限制为 512MB (防止膨胀)
-XX:MetaspaceSize=128m # 元空间上限
-XX:MaxMetaspaceSize=256m # 元空间最大限制
-XX:+UseG1GC # 使用 G1 垃圾回收器,减少停顿
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump # 崩溃时生成堆 dump 方便排查
-XX:+PrintGCDetails -XX:+PrintGCDateStamps # 可选:用于观察 GC 情况
针对 Nacos Server 的特殊处理:
如果必须运行 Nacos,它需要独立的内存。建议单独分配 512M-768M 给它:
JAVA_OPTS="-server -Xms512m -Xmx512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"
3. 数据库与中间件优化
2G 内存不仅要留给 Java,还要留给 MySQL 和 Redis。
-
MySQL (MariaDB):
- 不要使用默认的
innodb_buffer_pool_size(默认可能高达几百 MB)。 - 修改
my.cnf,将其限制在 256M – 384M 之间。[mysqld] innodb_buffer_pool_size = 256M max_connections = 50 thread_cache_size = 10 - 替代方案:如果数据量小,考虑使用 SQLite 或 H2 内嵌数据库(仅用于开发或极低并发测试),完全省去独立进程内存。
- 不要使用默认的
-
Redis:
- 修改
redis.conf,设置maxmemory为 128M 或 256M,并启用淘汰策略:maxmemory 256mb maxmemory-policy allkeys-lru
- 修改
4. 应用代码与配置层面的微调
-
关闭不必要的功能:
- 在
application.yml中禁用 Swagger/Knife4j 文档生成(生产环境不需要,且消耗内存)。 - 禁用 Actuator 的某些端点(如
/metrics,/threaddump),减少监控开销。 - 关闭
spring.cloud.nacos.config.enabled=false(如果改用本地配置文件)。
- 在
-
Docker 容器限制:
如果你使用 Docker 部署,务必在docker run或docker-compose.yml中显式限制资源,防止容器无限制占用宿主机内存:services: ruoyi-admin: image: ... mem_limit: 600m # 限制容器总内存 deploy: resources: limits: cpus: '1.5'
5. 运维层面的兜底措施
-
开启 Swap 分区:
虽然 Swap 会降低性能,但在 2G 内存下是防止 OOM Killer 杀死进程的最后一道防线。# 创建 2G 的 swap 文件 dd if=/dev/zero of=/swapfile bs=1M count=2048 chmod 600 /swapfile mkswap /swapfile swapon /swapfile # 设置 vm.swappiness=10 (让系统尽量不使用 swap,只在必要时使用) sysctl vm.swappiness=10 -
监控与告警:
安装轻量级监控工具(如htop或简单的 Shell 脚本),监控内存使用率。一旦接近 90%,立即重启服务或扩容。
总结建议
在 2 核 2G 服务器上运行 Ruoyi-Cloud,最可行的路径不是“优化现有架构”,而是“重构架构”。
- 首选:将项目改造为单体应用(去掉 Nacos, Gateway, 多个微服务 Jar),配合 JMX 限制 JVM 为 512M,MySQL 限制 256M,Redis 限制 128M。这样总内存占用可控制在 1.2GB 以内,系统能流畅运行。
- 次选:如果必须微服务,则必须将 Nacos 移出该服务器,并在应用侧通过硬编码连接数据库,仅保留核心业务服务。
警告:即使经过上述优化,2G 内存也仅适合个人学习、内部测试或极低并发(<50 QPS)的生产环境。如果涉及真实用户访问,强烈建议升级到 4 核 4G 以上的服务器。
PHPWP博客