努力
加油

Ubuntu 22.04部署RuoYi时如何配置Nginx和MySQL环境?

在 Ubuntu 22.04 上部署若依(RuoYi)前后端分离版本,核心在于搞定 Nginx(前端静态资源 + 反向XX)和 MySQL(后端数据存储)。若依官方文档通常给的是 Windows 或通用 Linux 流程,但在 Ubuntu 22.04 这种较新的系统上,直接照搬可能会有路径或权限问题。

下面是一份经过实战验证的、去除了废话的配置指南。假设你使用的是 RuoYi-Vue(前后端分离版),这是目前最主流的用法。


一、 前置准备:环境检查

Ubuntu 22.04 默认源里的软件版本比较新,但为了稳定性,我们尽量使用官方推荐的稳定包。

  1. 更新系统源

    sudo apt update && sudo apt upgrade -y
  2. 安装基础工具

    sudo apt install -y curl wget git unzip zip
  3. 确认 Java 环境
    若依后端需要 JDK 8 或 JDK 17。推荐 JDK 17(Spring Boot 3.x 支持更好,如果用的是旧版 RuoYi 则用 JDK 8)。

    # 以 JDK 17 为例
    sudo apt install openjdk-17-jdk -y
    java -version

二、 MySQL 配置(后端数据源)

RuoYi 默认使用 MySQL 5.7+ 或 8.0+。Ubuntu 22.04 默认源是 MySQL 8.0。

1. 安装 MySQL

sudo apt install mysql-server -y

2. 安全初始化

sudo mysql_secure_installation
  • 提示 VALIDATE PASSWORD COMPONENT 时,选 No(除非你有强迫症)。
  • 设置 root 密码。
  • 移除匿名用户、禁止远程 root 登录、删除 test 数据库,全部选 Y。

3. 创建若依专用数据库和用户

登录 MySQL:

sudo mysql -u root -p

执行 SQL(假设你的若依 SQL 文件在 /opt/ruoyi/sql/ 下):

-- 创建数据库,注意字符集必须为 utf8mb4
CREATE DATABASE IF NOT EXISTS ruoyi DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

-- 创建用户 (建议不要用 root,创建一个专用账户)
CREATE USER 'ruoyi'@'%' IDENTIFIED BY 'YourStrongPassword123!';
-- 如果是本地部署且只允许 localhost 访问,将 '%' 改为 'localhost'

-- 授权
GRANT ALL PRIVILEGES ON ruoyi.* TO 'ruoyi'@'%';
FLUSH PRIVILEGES;
EXIT;

4. 导入数据

# 进入若依项目目录下的 sql 文件夹
cd /path/to/ruoyi/sql
mysql -u ruoyi -p ruoyi < ruoyi_20230801.sql

注意:文件名根据你下载的若依版本日期可能不同。

5. 修改后端配置文件

打开 ruoyi-admin/src/main/resources/application-druid.yml(或 application.yml),修改数据库连接信息:

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      # 主库数据源
      master:
        url: jdbc:mysql://localhost:3306/ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: ruoyi
        password: YourStrongPassword123!

关键点:serverTimezone=GMT%2B8 必须加,否则时间会差 8 小时。


三、 Nginx 配置(前端 + 反向XX)

Nginx 在这里扮演两个角色:

  1. 托管 ruoyi-ui 编译后的 dist 静态文件。
  2. 将 /prod-api/* 的请求反向XX到后端的 8080 端口。

1. 安装 Nginx

sudo apt install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx

2. 部署前端静态文件

首先,你需要在前端开发机(Windows/Mac)上执行 npm run build,生成 dist 文件夹。然后将整个 dist 文件夹上传到服务器,例如 /var/www/ruoyi-ui。

sudo mkdir -p /var/www/ruoyi-ui
# 使用 scp 或 sftp 上传 dist 文件夹内容到此目录
sudo chown -R www-data:www-data /var/www/ruoyi-ui

3. 编写 Nginx 配置文件

删除默认配置,新建一个站点配置:

sudo rm /etc/nginx/sites-enabled/default
sudo nano /etc/nginx/sites-available/ruoyi.conf

写入以下内容(关键部分已标注):

server {
    listen 80;
    server_name your-domain.com; # 替换为你的域名,如果没有域名,可以留空或写 IP

    # 前端静态资源
    location / {
        root /var/www/ruoyi-ui;
        index index.html index.htm;
        try_files $uri $uri/ /index.html; # 重要:解决 Vue Router history 模式刷新 404 的问题
    }

    # 静态资源缓存优化(可选)
    location ~* .(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # 后端 API 反向XX
    # 若依前端请求通常以 /prod-api 开头
    location /prod-api/ {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # 这里指向后端 Spring Boot 服务的地址和端口
        proxy_pass http://127.0.0.1:8080/; 
    }

    # 防止大文件上传限制(若依有文件上传功能)
    client_max_body_size 100m;
}

解释:

  • try_files $uri $uri/ /index.html;:这是 Vue SPA 应用的标配,确保刷新页面不会 404。
  • proxy_pass http://127.0.0.1:8080/;:注意末尾的斜杠 /。因为前端请求是 /prod-api/system/user/getInfo,加上斜杠后,Nginx 会将请求转发为 http://127.0.0.1:8080/system/user/getInfo(去掉了 /prod-api 前缀)。如果你后端配置了 context-path,需相应调整。

4. 启用配置并重启

sudo ln -s /etc/nginx/sites-available/ruoyi.conf /etc/nginx/sites-enabled/
sudo nginx -t # 测试配置语法是否正确
sudo systemctl reload nginx

四、 启动后端服务

若依后端是一个 Spring Boot 应用,生产环境推荐使用 Jar 包方式运行,而不是直接用 IDE 跑。

  1. 打包后端
    在 ruoyi-admin 目录下执行:

    mvn clean package -DskipTests

    生成的 jar 包位于 target/ruoyi-admin.jar。

  2. 上传 Jar 包
    将 ruoyi-admin.jar 上传到服务器,例如 /opt/ruoyi/。

  3. 创建 Systemd 服务(推荐)
    相比 nohup,systemd 能更好地管理进程崩溃重启。

    sudo nano /etc/systemd/system/ruoyi.service

    内容如下:

    [Unit]
    Description=RuoYi Admin Service
    After=syslog.target network.target
    
    [Service]
    User=www-data
    Group=www-data
    ExecStart=/usr/bin/java -jar /opt/ruoyi/ruoyi-admin.jar --spring.profiles.active=prod
    SuccessExitStatus=143
    Restart=always
    RestartSec=10
    LimitNOFILE=102400
    
    [Install]
    WantedBy=multi-user.target

    注意:

    • User=www-data:与 Nginx 保持一致,避免权限冲突。如果后端需要读写特定目录,请确保该用户有权限。
    • ExecStart:确保 /usr/bin/java 路径正确,可以用 which java 查看。
    • --spring.profiles.active=prod:指定使用生产环境配置(对应 application-prod.yml)。
  4. 启动服务

    sudo systemctl daemon-reload
    sudo systemctl enable ruoyi
    sudo systemctl start ruoyi
    sudo systemctl status ruoyi

    查看日志:

    sudo journalctl -u ruoyi -f

五、 常见坑点排查

  1. 跨域问题(CORS)

    • 如果你在 Nginx 层做了反向XX,且前端和后端都在同一个域名下(通过 Nginx 分发),理论上不会有跨域问题。
    • 如果前端报 CORS 错误,检查 application.yml 中是否配置了自定义的 CORS 过滤器。在生产环境中,通常建议在 Nginx 层面处理,或者在后端代码中放行所有请求(因为 Nginx 已经统一了入口)。
  2. Redis 配置

    • 若依默认使用 Redis 做缓存。Ubuntu 上安装很简单:sudo apt install redis-server。
    • 确保 application.yml 中的 Redis 配置指向 127.0.0.1:6379。
    • 如果不需要 Redis,可以在配置文件中注释掉相关部分,但建议保留,性能提升明显。
  3. 防火墙/安全组

    • Ubuntu 22.04 默认可能有 ufw 防火墙。
      sudo ufw allow 80/tcp
      sudo ufw allow 22/tcp
      sudo ufw enable
    • 云服务器特别注意:阿里云、腾讯云等控制台的安全组必须开放 80 端口(HTTP)和 443 端口(HTTPS,如果配 SSL)。不要只开 22 和 3306。
  4. Nginx 502 Bad Gateway

    • 这通常意味着 Nginx 找到了,但连不上后端。
    • 检查 ruoyi.service 是否正在运行:systemctl status ruoyi。
    • 检查后端日志是否有报错。
    • 检查 Nginx 配置中的 proxy_pass 地址和端口是否正确。
  5. 前端白屏

    • 检查浏览器 Console 是否有网络请求失败。
    • 确认 try_files 配置是否生效。
    • 确认 dist 文件夹权限是否为 www-data。

六、 进阶:配置 HTTPS(Let’s Encrypt)

生产环境强烈建议上 HTTPS。使用 Certbot 最简单:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d your-domain.com

按照提示操作,Certbot 会自动修改 Nginx 配置并重定向 HTTP 到 HTTPS。


总结

  1. MySQL:建库、建用户、导 SQL、改 application-druid.yml 时区。
  2. Nginx:托管 dist、配置 try_files、反向XX /prod-api 到 8080。
  3. Java:打包成 Jar,用 Systemd 守护进程启动。
  4. 网络:开放 80/443 端口,配置好域名解析。

这套流程在 Ubuntu 22.04 上是标准且稳定的。如果遇到具体问题,先看 journalctl -u ruoyi 和 /var/log/nginx/error.log,90% 的问题都能从日志里找到答案。