针对2核2G服务器部署若依(Ruoyi-vue)项目常见的卡顿问题,可以从以下几个方面进行优化:
一、基础环境优化
1. 系统参数调整
# 增加文件描述符限制
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
# 调整内核参数(CentOS)
echo "vm.swappiness=10" >> /etc/sysctl.conf
echo "net.core.somaxconn=2048" >> /etc/sysctl.conf
sysctl -p
2. 服务分离部署
# 建议将服务拆分到不同容器或进程
# 方案1:Nginx + Redis + MySQL + Java应用分离
# 方案2:使用Docker Compose分别部署
二、Java应用优化
1. JVM参数优化
# 修改启动脚本(ruoyi-admin的start.sh或application.yml)
JAVA_OPTS="-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"
# 或
JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
2. Spring Boot配置优化
# application.yml
server:
tomcat:
max-threads: 50 # 减少线程数(默认200)
min-spare-threads: 10
max-connections: 1000
accept-count: 100
compression:
enabled: true
mime-types: application/json,application/xml,text/html,text/xml,text/plain
三、数据库优化
1. MySQL配置优化(my.cnf)
[mysqld]
# 内存相关
key_buffer_size = 16M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
# 连接相关
max_connections = 50 # 减少连接数
wait_timeout = 300
interactive_timeout = 300
# InnoDB优化
innodb_buffer_pool_size = 256M # 关键参数
innodb_log_file_size = 64M
innodb_flush_log_at_trx_commit = 2
2. Redis优化
# application-redis.yml
redis:
lettuce:
pool:
max-active: 8 # 减少连接数
max-idle: 8
min-idle: 0
四、前端优化
1. Nginx配置优化
# 启用gzip压缩
gzip on;
gzip_min_length 1k;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/css;
# 静态资源缓存
location ~* .(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# 反向XX优化
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
2. 前端构建优化
// vue.config.js
module.exports = {
productionSourceMap: false, // 关闭sourcemap
configureWebpack: {
optimization: {
splitChunks: {
chunks: 'all',
minSize: 10000,
maxSize: 250000,
}
}
}
}
五、应用层优化
1. 若依特定优化
# application.yml
# 关闭不必要的功能
ruoyi:
# 减少日志级别
log:
level: WARN
# 调整定时任务线程池
job:
pool-size: 5
2. 代码层面优化
// 1. 减少不必要的@Async异步调用
// 2. 优化复杂SQL查询,添加索引
// 3. 使用@Cacheable缓存热点数据
// 4. 分页查询添加limit限制
六、监控与诊断
1. 安装监控工具
# 安装htop查看资源使用
yum install htop -y # CentOS
apt install htop -y # Ubuntu
# 使用arthas进行Java诊断
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
2. 常用诊断命令
# 查看内存使用
free -h
top -p $(pgrep -f java)
# 查看连接数
netstat -an | grep :8080 | wc -l
# 查看慢查询
mysqldumpslow -s t /var/log/mysql/slow.log
七、应急方案
1. 临时缓解措施
# 重启服务(按顺序)
systemctl restart redis
systemctl restart mysql
systemctl restart nginx
# 最后重启Java应用
# 清理缓存
sync && echo 3 > /proc/sys/vm/drop_caches
2. 降级策略
- 关闭非核心功能(如websocket、定时任务)
- 静态化首页
- 减少数据导出/导入的并发
建议的部署架构
方案A(单机优化):
Nginx(80) → Ruoyi-vue(8080) + Redis + MySQL
方案B(推荐-容器化):
Docker Compose部署,每个服务独立容器,资源限制:
ruoyi-app: 内存1G, CPU 1核
mysql: 内存512M, CPU 0.5核
redis: 内存128M, CPU 0.3核
nginx: 内存64M, CPU 0.2核
注意事项
- 定期重启:建议每周重启一次应用释放内存
- 日志清理:配置logrotate定期清理日志
- 备份策略:确保数据库定时备份
- 升级考虑:如业务增长,建议升级到4核4G配置
通过以上优化,2核2G服务器应该能够稳定运行若依系统,支持50-100并发用户。如果仍有卡顿,建议使用APM工具(如SkyWalking)进一步分析性能瓶颈。
CLOUD技术笔记