使用2核2G的云服务器部署若依系统需要优化哪些配置?

在 2 核 2G 的云服务器上部署若依(RuoYi)系统属于极限配置。若依默认基于 Spring Boot + MyBatis Plus + Vue,对内存和 CPU 有一定要求。直接运行默认配置极易出现 OOM(内存溢出)、启动慢或响应卡顿。

为了稳定运行,你需要从 JVM 参数、数据库优化、中间件精简、Nginx 反向X_X、以及代码/构建优化 五个维度进行深度裁剪和调优。

1. JVM 参数优化(核心关键)

这是最重要的一环。2G 内存扣除操作系统占用后,Java 进程通常只能分配 500MB-800MB 左右。必须强制限制堆内存并开启压缩指针。

  • 调整 application.yml 中的 JVM 参数
    在启动脚本或 Docker 命令中,务必添加以下参数:

    -Xms256m -Xmx512m -XX:MaxMetaspaceSize=128m -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError
    • -Xms256m: 初始堆大小设为 256M,避免频繁扩容。
    • -Xmx512m: 最大堆大小设为 512M,防止吃光内存导致被 Linux OOM Killer 杀掉。
    • -XX:MaxMetaspaceSize=128m: 限制元空间,防止类加载过多撑爆内存。
    • -XX:+UseG1GC: 使用 G1 垃圾回收器,更适合小内存场景下的低延迟。
  • Spring Boot 配置
    application.yml 中关闭不必要的自动配置模块(如果项目中有),例如:

    spring:
      jmx:
        enabled: false # 关闭 JMX 监控以节省资源
    server:
      compression:
        enabled: true  # 开启 Gzip 压缩,减少网络传输压力
      tomcat:
        max-threads: 20 # 降低线程池数量,2 核 CPU 跑太多线程会上下文切换频繁
        min-spare-threads: 5

2. 数据库与缓存优化

若依默认依赖 MySQL 和 Redis,这两个服务本身非常吃内存。

  • MySQL 优化 (my.cnf)
    2G 机器上的 MySQL 必须极度精简。

    [mysqld]
    port = 3306
    basedir = /usr/local/mysql
    datadir = /var/lib/mysql
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci
    
    # 关键内存限制
    innodb_buffer_pool_size = 128M  # 默认通常是总内存的 50%-70%,必须改小
    max_connections = 50            # 限制并发连接数
    query_cache_type = 0            # 关闭查询缓存(高并发下反而有害,且占内存)
    sort_buffer_size = 256K
    read_buffer_size = 256K
    join_buffer_size = 256K
    key_buffer_size = 16M           # 仅用于索引

    建议:如果是生产环境,考虑使用 SQLite (仅限测试) 或 MongoDB (视业务而定),但通常 MySQL 仍需保留,重点在于限制 Buffer Pool。

  • Redis 优化
    若依需要 Redis 做缓存和 Session 存储。

    # redis.conf
    maxmemory 256mb              # 限制最大内存
    maxmemory-policy allkeys-lru # 当内存满时,淘汰最近最少使用的键
    timeout 300                  # 设置超时断开空闲连接

3. 中间件与架构精简

  • 移除非必要组件
    若依标准版包含很多模块(如定时任务、消息队列 RabbitMQ/RocketMQ、Elasticsearch 等)。

    • 禁用 RabbitMQ/RocketMQ:除非有复杂异步需求,否则在 2C2G 上不要部署 MQ,改用本地异步处理或简单队列。
    • 禁用 Elasticsearch:搜索功能可降级为 MySQL LIKE 查询(配合索引优化),或者使用轻量级的 SQLite 全文索引。
    • MinIO/OSS:文件上传服务若自建 MinIO 太占内存,建议直接使用对象存储服务(如阿里云 OSS、腾讯云 COS),或者将文件上传到服务器本地磁盘并挂载 Nginx。
  • 前端分离策略
    若依前后端分离。如果后端只负责 API,前端静态资源(Vue 打包后的 dist)应通过 Nginx 托管,而不是让 Tomcat/Spring Boot 去处理静态文件请求。

    • 配置 Nginx 监听 80 端口,反向X_X /sys 等路径到后端 8080 端口。
    • 这样后端只需处理 JSON 数据交互,负载大幅降低。

4. 系统级与构建优化

  • Docker 容器化限制
    如果使用 Docker 部署,务必在 docker rundocker-compose.yml 中限制资源:

    services:
      ruoyi-backend:
        image: ...
        mem_limit: 800m          # 硬限制内存
        cpus: '1.5'              # 限制 CPU 使用率,防止单核满载
        deploy:
          resources:
            limits:
              memory: 800M
  • 构建产物瘦身
    • 使用 Maven 的 spring-boot-maven-plugin 打包时,确保排除不必要的依赖。
    • 删除项目中未使用的 Controller、Service 和实体类。
    • 将日志级别调整为 INFOWARN,避免 DEBUG 模式产生大量 IO 和内存开销。
    • 配置 Logback/Log4j2 滚动策略,避免日志文件过大占用磁盘 IO。

5. 数据库索引与 SQL 审查

在低配服务器上,慢查询是性能杀手。

  • 全表扫描检查:检查所有涉及列表查询的 SQL,确保 WHERE 条件字段都有索引。
  • *避免 `SELECT `**:只查询需要的字段。
  • 分页优化:若依的分页逻辑需确认是否使用了深度分页(Deep Pagination),对于大数据量,建议使用“游标法”或 ID 范围查询代替 LIMIT offset, size

总结与建议方案

在 2 核 2G 环境下,若依系统的生存法则就是"做减法"。

优化项 推荐配置/操作 预期收益
JVM -Xmx512m, -XX:MaxMetaspaceSize=128m 防止 OOM,保证启动成功
Tomcat max-threads=20 降低上下文切换,提升响应速度
MySQL innodb_buffer_pool_size=128M 释放内存给 Java 进程
Nginx 独立部署,处理静态资源和反向X_X 减轻后端压力
依赖 移除 MQ、ES、MinIO 等重型中间件 减少系统整体内存占用
日志 级别设为 INFO,定期清理 减少磁盘 IO 和内存写入

最终建议
如果业务允许,强烈建议升级到 4 核 4G。2 核 2G 仅适合开发测试、个人学习或极轻量的内部工具。如果是正式生产环境且无法升级硬件,请务必做好每日备份(防止崩溃数据丢失)和监控告警(配置简单的内存/CPU 监控脚本),一旦内存使用率持续超过 90% 立即重启服务或扩容。