当前位置: 首页 > news >正文

若依项目部署上线全攻略:从本地打包到宝塔面板配置(含SSL证书与跨域避坑)

若依项目生产环境部署实战:从零搭建到HTTPS全流程

在当今企业级应用开发中,SpringBoot+Vue的前后端分离架构已成为主流选择。若依(RuoYi)作为这一架构的典型实现,集成了权限管理、代码生成等企业级功能,但许多团队在从开发环境转向生产部署时仍会遇到各种"坑"。本文将手把手带你完成若依系统的全栈部署,涵盖从服务器准备到Nginx调优的全套实战经验。

1. 部署前的环境准备

在开始部署前,我们需要确保服务器环境满足基本要求。根据若依官方文档建议,生产环境推荐以下配置:

服务器最低配置要求:

  • CPU:2核以上(建议4核)
  • 内存:4GB以上(建议8GB)
  • 磁盘:50GB以上SSD
  • 操作系统:CentOS 7+/Ubuntu 18.04+

软件依赖清单:

组件版本要求备注
JDK1.8+推荐OpenJDK 11
MySQL5.7+推荐8.0版本
Redis5.0+必须启用持久化
Node.js14+前端构建依赖
Nginx1.18+反向代理/静态资源服务

提示:建议所有组件都通过官方源安装,避免使用第三方打包版本可能存在的兼容性问题。

防火墙配置关键命令:

# 开放必要端口(根据实际需要调整) firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --zone=public --add-port=443/tcp --permanent firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --zone=public --add-port=6379/tcp --permanent firewall-cmd --reload

目录结构规划建议:

/opt/ruoyi/ ├── backend/ # 后端项目目录 │ ├── app/ # 可执行JAR包 │ ├── config/ # 应用配置文件 │ └── logs/ # 日志文件 ├── frontend/ # 前端项目目录 │ └── dist/ # 前端构建产物 └── data/ # 数据存储 ├── mysql/ # 数据库数据 └── redis/ # Redis数据

2. 后端项目部署实战

2.1 数据库初始化

首先创建专属数据库用户(避免使用root账户):

CREATE DATABASE `ry-cloud` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER 'ry-user'@'%' IDENTIFIED BY 'Complex-Password-123'; GRANT ALL PRIVILEGES ON `ry-cloud`.* TO 'ry-user'@'%'; FLUSH PRIVILEGES;

导入若依SQL文件时的常见问题处理:

  • 如果遇到"Row size too large"错误,需要修改MySQL配置:
    innodb_file_format=Barracuda innodb_file_per_table=ON innodb_large_prefix=ON

2.2 生产环境配置调整

修改application-prod.yml关键配置项:

server: port: 8080 servlet: context-path: / spring: datasource: url: jdbc:mysql://mysql-server:3306/ry-cloud?useSSL=false&allowPublicKeyRetrieval=true username: ry-user password: Complex-Password-123 redis: host: redis-server port: 6379 password: redis-password-123 database: 0

日志配置优化建议:logback-spring.xml中增加按天归档和最大保存天数配置:

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/opt/ruoyi/backend/logs/ruoyi-%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> </appender>

2.3 服务化部署方案

推荐使用systemd管理SpringBoot应用:

# /etc/systemd/system/ruoyi.service [Unit] Description=RuoYi Service After=syslog.target network.target [Service] User=www Group=www ExecStart=/usr/bin/java -Xms512m -Xmx1024m -jar /opt/ruoyi/backend/app/ruoyi.jar SuccessExitStatus=143 Restart=always RestartSec=10 [Install] WantedBy=multi-user.target

启用并启动服务:

systemctl daemon-reload systemctl enable ruoyi systemctl start ruoyi

3. 前端项目部署进阶

3.1 多环境构建配置

vite.config.js中配置不同环境的API地址:

export default defineConfig(({ mode }) => { const env = loadEnv(mode, process.cwd()) return { server: { proxy: { [env.VITE_APP_BASE_API]: { target: env.VITE_APP_API_URL, changeOrigin: true, rewrite: (path) => path.replace(new RegExp(`^${env.VITE_APP_BASE_API}`), '') } } } } })

对应环境文件.env.production配置:

VITE_APP_API_URL = https://api.yourdomain.com VITE_APP_BASE_API = /prod-api

3.2 静态资源优化策略

构建时启用gzip压缩:

npm install vite-plugin-compression -D

vite.config.js中添加:

import viteCompression from 'vite-plugin-compression' plugins: [ viteCompression({ algorithm: 'gzip', ext: '.gz', deleteOriginFile: false }) ]

4. Nginx高级配置实战

4.1 反向代理配置

完整Nginx配置示例:

upstream ruoyi-backend { server 127.0.0.1:8080; keepalive 32; } server { listen 80; server_name yourdomain.com; location /prod-api/ { proxy_pass http://ruoyi-backend/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 长连接优化 proxy_http_version 1.1; proxy_set_header Connection ""; } location / { root /opt/ruoyi/frontend/dist; try_files $uri $uri/ /index.html; expires 30d; # 启用gzip gzip_static on; } }

4.2 HTTPS安全加固

使用Let's Encrypt免费证书:

certbot --nginx -d yourdomain.com

自动续期配置:

# 添加定时任务 crontab -e 0 3 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"

安全加固配置建议:

ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'; ssl_prefer_server_ciphers on; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; add_header Strict-Transport-Security "max-age=63072000" always;

5. 部署后检查清单

系统健康检查项:

  1. 服务进程状态

    systemctl status ruoyi ps aux | grep java
  2. 端口监听检查

    netstat -tulnp | grep -E '80|443|8080'
  3. 数据库连接测试

    mysql -h mysql-server -u ry-user -p -e "SHOW DATABASES;"
  4. Redis连通性测试

    redis-cli -h redis-server -a yourpassword PING

性能优化建议参数:

  • JVM参数调整(根据服务器内存):

    -Xms1g -Xmx2g -XX:MaxMetaspaceSize=512m
  • MySQL优化参数:

    innodb_buffer_pool_size = 1G innodb_log_file_size = 256M
  • Redis内存配置:

    maxmemory 2gb maxmemory-policy allkeys-lru

6. 常见问题解决方案

跨域问题终极解决方案:

  1. 后端配置(推荐):
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("*") .allowedHeaders("*") .allowCredentials(true) .maxAge(3600); } }
  1. Nginx配置方案:
location / { add_header 'Access-Control-Allow-Origin' '$http_origin'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization'; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; }

静态资源404问题排查步骤:

  1. 检查Nginx root路径是否正确
  2. 确认文件权限(www用户需有读取权限)
  3. 验证文件是否实际存在
  4. 检查Nginx error日志获取详细信息

性能瓶颈排查工具推荐:

  • Arthas:Java诊断工具

    # 查看方法调用耗时 trace com.ruoyi.*Controller *
  • Nginx状态监控:

    location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; }

7. 自动化部署进阶

7.1 使用Docker Compose部署

docker-compose.yml示例:

version: '3' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: ry-cloud volumes: - ./data/mysql:/var/lib/mysql ports: - "3306:3306" restart: always redis: image: redis:6 command: redis-server --requirepass redis123 volumes: - ./data/redis:/data ports: - "6379:6379" restart: always backend: build: ./backend ports: - "8080:8080" depends_on: - mysql - redis restart: always frontend: build: ./frontend ports: - "80:80" depends_on: - backend restart: always

7.2 CI/CD集成示例(GitLab CI)

.gitlab-ci.yml配置:

stages: - build - deploy build-backend: stage: build script: - mvn clean package -DskipTests artifacts: paths: - target/*.jar deploy-production: stage: deploy only: - master script: - scp target/ruoyi.jar user@production-server:/opt/ruoyi/backend/app/ - ssh user@production-server "systemctl restart ruoyi"

8. 监控与维护

基础监控方案:

  1. Spring Boot Actuator配置:
management: endpoints: web: exposure: include: "*" endpoint: health: show-details: always
  1. Prometheus监控集成:
<!-- pom.xml添加依赖 --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>

日志收集方案:

ELK栈配置建议:

# Filebeat配置示例 filebeat.inputs: - type: log paths: - /opt/ruoyi/backend/logs/*.log output.logstash: hosts: ["logstash-server:5044"]

9. 安全加固措施

必做安全清单:

  1. 修改默认密码(数据库、Redis)
  2. 关闭不必要的端口
  3. 定期更新系统补丁
  4. 配置防火墙规则
  5. 实施备份策略

敏感信息保护:

  • 使用Vault管理密钥:

    vault kv put secret/ruoyi mysql_password=xxx redis_password=xxx
  • Spring Cloud Config集成:

    spring: cloud: vault: host: vault-server port: 8200 scheme: http kv: enabled: true backend: secret profile-separator: '/' application-name: ruoyi

10. 性能调优实战

JVM调优参数示例:

-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45 -XX:+AlwaysPreTouch -XX:+UseStringDeduplication

数据库连接池优化:

spring: datasource: druid: initial-size: 5 min-idle: 5 max-active: 20 max-wait: 60000 time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 300000 validation-query: SELECT 1 test-while-idle: true test-on-borrow: false test-on-return: false

Redis连接池配置:

spring: redis: lettuce: pool: max-active: 20 max-idle: 10 min-idle: 5 max-wait: 3000

在实际项目部署中,我们团队发现最大的性能瓶颈往往出现在数据库连接管理和缓存策略上。通过合理配置连接池参数和实现多级缓存(Redis + Caffeine),可以将系统吞吐量提升3-5倍。

http://www.cnnetsun.cn/news/1778083.html

相关文章:

  • Intv_AI_MK11全栈开发环境搭建:Node.js安装及后端服务集成
  • Zotero中文文献管理终极指南:茉莉花插件3大核心功能详解
  • Redis 高级篇 (分布式缓存)
  • CUDA12.4环境适配:OpenClaw调用Qwen3-32B-Chat镜像的兼容性指南
  • Nomic-Embed-Text-V2-MoE企业内训:Java面试题中的算法与数据结构优化思路
  • BGE Reranker-v2-m3企业应用:与Elasticsearch/KiwiSearch深度集成方案
  • 茉莉花插件:提升Zotero中文文献管理效率的全面解决方案
  • 忍者像素绘卷惊艳效果:‘地爆天星’引力场可视化——粒子密度与像素抖动算法
  • 【限时开放】微软Edge AI Lab最新.NET 9边缘压力测试矩阵(含断电模拟、SIM卡热插拔、-40℃冷凝环境日志采集方案)
  • 为什么92%的.NET开发者在.NET 9中AI推理失败?5个被官方文档隐藏的关键配置陷阱
  • 保姆级教程:在Ubuntu 18.04上搞定Intel D455相机驱动与ROS环境(含常见报错解决)
  • 圣女司幼幽-造相Z-Turbo效果展示:背景朦胧度与人物清晰度的平衡控制案例
  • Sability安卓(一)_环境的搭建-Android Studio示例,禁止内存爆满!!!!
  • 【STM32MP257-DK】01 ST MPU 生态资源使用、环境搭建以及镜像更新
  • PYTHON学习笔记9(匿名函数、装饰器、数据结构)
  • AI 正在重塑我们的思维方式
  • Holistic Tracking应用案例:在线健身指导、动作规范分析一键搞定
  • DownKyi免费终极指南:三步解锁B站8K视频下载的完整解决方案
  • wxappUnpacker技术解析与实战指南:小程序逆向工程的开源工具实践
  • 如何保障工程信号传输不受信号干扰
  • 3步快速上手:Degrees of Lewdity中文汉化终极指南
  • 墨语灵犀入门教程:Python爬虫数据清洗与信息提取实战
  • Guohua Diffusion场景应用:用AI为文创产品设计国风插画,实战案例分享
  • 美国飞船 1.5 亿的太空厕所已瘫痪。NASA:小 bug。网友:和航母厕所同一家供应商么
  • 俄罗斯电商综合知识 | 新手入行,Captain AI是你的专属百科
  • 零基础5分钟上手:RexUniNLU零样本NLP实战,无需标注数据
  • 看看MusePublic能做什么?高清、细腻光影的艺术人像生成案例分享
  • AcousticSense AI效果实测:上传歌曲,AI准确识别流行、摇滚、古典等风格
  • EPLAN项目检查的5个隐藏技巧:让自动检查效率提升300%
  • NVIDIA Profile Inspector完整指南:释放显卡隐藏性能的终极教程