在 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 数据交互,负载大幅降低。
- 配置 Nginx 监听 80 端口,反向X_X
4. 系统级与构建优化
- Docker 容器化限制:
如果使用 Docker 部署,务必在docker run或docker-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 和实体类。
- 将日志级别调整为
INFO或WARN,避免 DEBUG 模式产生大量 IO 和内存开销。 - 配置 Logback/Log4j2 滚动策略,避免日志文件过大占用磁盘 IO。
- 使用 Maven 的
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% 立即重启服务或扩容。
云知识