Linux下RuoYi前后端不分离版部署实战:从环境搭建到容器化优化

引言:为什么选择RuoYi不分离版本?

在众多开源后台管理系统中,RuoYi凭借其简洁的设计和丰富的功能模块脱颖而出。对于中小型企业或快速开发场景,前后端不分离版本提供了更简单的部署方式和更低的维护成本。不同于分离版本需要分别部署前后端服务,不分离版本将所有资源打包成单个可执行文件,特别适合资源有限的服务器环境。

我在实际项目部署中发现,许多开发者容易在JDK多版本共存、MySQL容器化权限配置等环节遇到问题。本文将结合实战经验,通过对比传统部署与容器化方案的差异,提供一套可复用的部署方案。我们将从基础环境准备开始,逐步完成项目编译、数据库配置,最终实现生产级部署,期间会穿插多个避坑技巧和性能优化建议。

1. 基础环境准备与优化配置

1.1 JDK安装与环境隔离

RuoYi要求JDK 1.8及以上版本,但在实际服务器环境中,经常遇到多版本JDK共存导致的冲突问题。以下是经过验证的安全安装方案:

# 创建标准化目录结构
mkdir -p /data/{service,tmp,gitee}

# 下载Oracle JDK 8u261(建议使用wget直接获取)
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn/java/jdk/8u261-b12/a4634525489241b9a9e1aa73d9e118e6/jdk-8u261-linux-x64.tar.gz -P /data/tmp

# 解压并设置专属环境变量
tar -zxvf /data/tmp/jdk-8u261-linux-x64.tar.gz -C /data/service

为避免影响系统其他Java应用,推荐使用局部环境变量配置。创建/etc/profile.d/ruoyi.sh文件:

# RuoYi专属环境配置
export JAVA_HOME=/data/service/jdk1.8.0_261
export PATH=$JAVA_HOME/bin:$PATH

验证安装时,特别注意系统可能存在的其他JDK版本干扰:

# 加载环境变量后验证
source /etc/profile
which java  # 应显示/data/service下的路径
java -version  # 应显示1.8.0_261

1.2 Maven配置与阿里云镜像加速

Maven依赖下载缓慢是常见痛点,通过以下配置可提升10倍以上下载速度:

# 安装Maven 3.6.3
wget https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz -P /data/tmp
tar -zxvf /data/tmp/apache-maven-*.tar.gz -C /data/service

修改/data/service/apache-maven-3.6.3/conf/settings.xml

<!-- 本地仓库路径 -->
<localRepository>/data/service/repository</localRepository>

<!-- 镜像配置 -->
<mirror>
  <id>aliyunmaven</id>
  <mirrorOf>*</mirrorOf>
  <name>阿里云公共仓库</name>
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>

常见问题排查表

现象可能原因解决方案
依赖下载失败网络超时检查mirror配置有效性
编译报错JDK版本不符确认JAVA_HOME指向1.8+
权限拒绝目录权限不足chown -R user:user /data/service

1.3 Git部署与SSH密钥管理

代码克隆环节的认证问题常被忽视,推荐使用SSH密钥方式:

# 编译安装Git 2.18+
yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel
tar -zxvf git-2.18.0.tar.gz
cd git-2.18.0
./configure --prefix=/data/service/git
make && make install

生成专属部署密钥对:

ssh-keygen -t rsa -b 4096 -C "ruoyi_deploy" -f ~/.ssh/ruoyi_rsa
cat ~/.ssh/ruoyi_rsa.pub  # 将输出内容添加到Gitee/GitHub账户

测试连接时使用指定密钥:

ssh -T -i ~/.ssh/ruoyi_rsa git@gitee.com

2. MySQL容器化部署实战

2.1 Docker安装与镜像加速

传统MySQL安装涉及大量依赖和配置,容器化方案可大幅简化流程:

# 卸载旧版本
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

# 安装依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 设置阿里云镜像仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装Docker CE
sudo yum install docker-ce docker-ce-cli containerd.io

配置镜像加速器:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://plb9xzjh.mirror.aliyuncs.com"],
  "log-driver": "json-file",
  "log-opts": {"max-size": "100m", "max-file": "3"}
}
EOF

2.2 MySQL容器化部署关键步骤

使用官方MySQL 5.7镜像时,需特别注意中文编码和权限配置:

# 创建配置目录
mkdir -p /data/docker/mysql/{conf,data,logs}

# 编写自定义配置文件
cat > /data/docker/mysql/conf/my.cnf <<EOF
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
max_connections=1000
log-error=/var/log/mysql/error.log

[client]
default-character-set=utf8mb4
EOF

启动容器时需绑定关键目录:

docker run -d --name mysql \
  -p 3306:3306 \
  -v /data/docker/mysql/conf:/etc/mysql/conf.d \
  -v /data/docker/mysql/data:/var/lib/mysql \
  -v /data/docker/mysql/logs:/var/log/mysql \
  -e MYSQL_ROOT_PASSWORD=RuoYi@123 \
  --restart always \
  mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

权限配置要点

# 进入容器配置远程访问
docker exec -it mysql mysql -uroot -pRuoYi@123 -e \
"GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'RuoYi@123' WITH GRANT OPTION; FLUSH PRIVILEGES;"

2.3 数据库初始化技巧

RuoYi的SQL脚本需要特别注意执行顺序:

# 复制SQL文件到容器可访问目录
cp /data/gitee/RuoYi/sql/{quartz,ry_*}.sql /data/docker/mysql/conf/

# 批量执行初始化脚本
docker exec -i mysql mysql -uroot -pRuoYi@123 <<EOF
CREATE DATABASE IF NOT EXISTS ruoyi DEFAULT CHARACTER SET utf8mb4;
USE ruoyi;
SOURCE /etc/mysql/conf.d/quartz.sql;
SOURCE /etc/mysql/conf.d/ry_$(date +%Y%m%d).sql;
SHOW TABLES;
EOF

3. 项目编译与部署优化

3.1 源码获取与配置调整

使用SSH方式克隆代码可避免频繁认证:

GIT_SSH_COMMAND="ssh -i ~/.ssh/ruoyi_rsa" git clone git@gitee.com:y_project/RuoYi.git /data/gitee/RuoYi

关键配置修改点:

  1. 数据库连接 (ruoyi-admin/src/main/resources/application-druid.yml):
master:
  url: jdbc:mysql://localhost:3306/ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai
  username: root
  password: RuoYi@123
  1. 文件上传路径 (ruoyi-admin/src/main/resources/application.yml):
profile: /data/app/ruoyi-admin/uploadPath

3.2 高效编译与打包策略

使用并行编译提升效率:

cd /data/gitee/RuoYi
mvn clean package -Dmaven.test.skip=true -T 1C

后台启动脚本示例 (/data/app/ruoyi-admin/start.sh):

#!/bin/bash
APP_HOME=$(cd $(dirname $0); pwd)
JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m"

nohup java $JAVA_OPTS -jar $APP_HOME/ruoyi-admin.jar > $APP_HOME/nohup.out 2>&1 &

# 健康检查
for i in {1..10}; do
  if grep -q "Started RuoYiApplication" $APP_HOME/nohup.out; then
    echo "Application started successfully!"
    exit 0
  fi
  sleep 3
done
echo "Application start failed, check nohup.out for details"
exit 1

3.3 日志管理与监控

合理的日志配置可大幅降低运维难度:

  1. Logback配置优化 (logback.xml):
<property name="LOG_PATH" value="/data/app/ruoyi-admin/logs" />
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  <fileNamePattern>${LOG_PATH}/ruoyi-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  <maxFileSize>50MB</maxFileSize>
  <maxHistory>30</maxHistory>
  <totalSizeCap>5GB</totalSizeCap>
</rollingPolicy>
  1. 日志实时监控命令:
tail -f /data/app/ruoyi-admin/logs/ruoyi-$(date +%Y-%m-%d).0.log | grep -E 'ERROR|WARN'

4. 安全加固与性能调优

4.1 容器安全最佳实践

MySQL容器需要特别注意的安全配置:

# 限制容器资源使用
docker update mysql \
  --memory 2g \
  --memory-swap 2g \
  --cpus 1

# 启用容器健康检查
docker run ... \
  --health-cmd="mysqladmin ping -uroot -pRuoYi@123" \
  --health-interval=30s \
  --health-timeout=5s \
  --health-retries=3

4.2 应用层防护措施

RuoYi默认配置需要加强的方面:

  1. 修改默认密码
# 进入系统后立即修改admin密码
UPDATE sys_user SET password='$2a$10$YNUV/BFDa8ZVEJXqKG.ue.5ZJ9ZWzHZxtC7/8F3Jz2wL9LqL5QbK2' WHERE user_name='admin';
  1. 禁用不必要的接口
# application.yml
shiro:
  filter:
    chainDefinitions: |
      /logout = logout
      /login = anon
      /captcha/** = anon
      /druid/** = anon  # 生产环境建议关闭

4.3 性能调优参数

根据服务器配置调整关键参数:

JVM调优参考

参数4核8G8核16G说明
-Xms2g4g初始堆大小
-Xmx4g8g最大堆大小
-XX:MetaspaceSize256m512m元空间初始
-XX:MaxMetaspaceSize1g2g元空间最大
-Xmn1g2g新生代大小

MySQL容器优化

docker run ... \
  -e innodb_buffer_pool_size=1G \
  -e innodb_log_file_size=256M \
  -e innodb_flush_log_at_trx_commit=2 \
  -e sync_binlog=1000

5. 自动化运维方案

5.1 备份恢复策略

数据库定期备份脚本 (/usr/local/bin/mysql_backup.sh):

#!/bin/bash
BACKUP_DIR="/data/backups/mysql"
DATE=$(date +%Y%m%d%H%M)
DOCKER_NAME="mysql"

docker exec ${DOCKER_NAME} mysqldump -uroot -pRuoYi@123 --routines --triggers --single-transaction ruoyi | gzip > ${BACKUP_DIR}/ruoyi_${DATE}.sql.gz

# 保留最近7天备份
find ${BACKUP_DIR} -name "*.sql.gz" -type f -mtime +7 -exec rm -f {} \;

5.2 监控告警配置

使用Prometheus监控关键指标:

  1. JVM监控 (application.yml):
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,prometheus
  metrics:
    export:
      prometheus:
        enabled: true
  1. MySQL监控 (my.cnf):
[mysqld]
performance_schema=ON
userstat=ON

5.3 容器化编排建议

对于多实例部署,推荐使用docker-compose管理:

version: '3'
services:
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: RuoYi@123
    volumes:
      - /data/docker/mysql/data:/var/lib/mysql
      - /data/docker/mysql/conf:/etc/mysql/conf.d
    ports:
      - "3306:3306"
    restart: always
    
  ruoyi:
    build: .
    depends_on:
      - mysql
    ports:
      - "8080:8080"
    volumes:
      - /data/app/ruoyi-admin/uploadPath:/data/app/ruoyi-admin/uploadPath
    restart: always

结语:部署后的关键检查项

完成部署后,建议进行以下验证:

  1. 使用SELECT @@version确认MySQL字符集为utf8mb4
  2. 检查java -version输出是否为指定版本
  3. 通过curl -I http://localhost:8080验证应用健康状态
  4. 监控docker stats查看容器资源占用情况

在最近的一个电商后台项目中,采用这套方案后,部署时间从原来的3小时缩短到40分钟,系统稳定性显著提升。特别是在高并发场景下,经过调优的容器化MySQL实例QPS提升了2倍以上。

更多推荐