若依项目部署上线全攻略:从本地打包到宝塔面板配置(含SSL证书与跨域避坑)
若依项目生产环境部署实战:从零搭建到HTTPS全流程
在当今企业级应用开发中,SpringBoot+Vue的前后端分离架构已成为主流选择。若依(RuoYi)作为这一架构的典型实现,集成了权限管理、代码生成等企业级功能,但许多团队在从开发环境转向生产部署时仍会遇到各种"坑"。本文将手把手带你完成若依系统的全栈部署,涵盖从服务器准备到Nginx调优的全套实战经验。
1. 部署前的环境准备
在开始部署前,我们需要确保服务器环境满足基本要求。根据若依官方文档建议,生产环境推荐以下配置:
服务器最低配置要求:
- CPU:2核以上(建议4核)
- 内存:4GB以上(建议8GB)
- 磁盘:50GB以上SSD
- 操作系统:CentOS 7+/Ubuntu 18.04+
软件依赖清单:
| 组件 | 版本要求 | 备注 |
|---|---|---|
| JDK | 1.8+ | 推荐OpenJDK 11 |
| MySQL | 5.7+ | 推荐8.0版本 |
| Redis | 5.0+ | 必须启用持久化 |
| Node.js | 14+ | 前端构建依赖 |
| Nginx | 1.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 ruoyi3. 前端项目部署进阶
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-api3.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. 部署后检查清单
系统健康检查项:
服务进程状态
systemctl status ruoyi ps aux | grep java端口监听检查
netstat -tulnp | grep -E '80|443|8080'数据库连接测试
mysql -h mysql-server -u ry-user -p -e "SHOW DATABASES;"Redis连通性测试
redis-cli -h redis-server -a yourpassword PING
性能优化建议参数:
JVM参数调整(根据服务器内存):
-Xms1g -Xmx2g -XX:MaxMetaspaceSize=512mMySQL优化参数:
innodb_buffer_pool_size = 1G innodb_log_file_size = 256MRedis内存配置:
maxmemory 2gb maxmemory-policy allkeys-lru
6. 常见问题解决方案
跨域问题终极解决方案:
- 后端配置(推荐):
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("*") .allowedHeaders("*") .allowCredentials(true) .maxAge(3600); } }- 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问题排查步骤:
- 检查Nginx root路径是否正确
- 确认文件权限(www用户需有读取权限)
- 验证文件是否实际存在
- 检查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: always7.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. 监控与维护
基础监控方案:
- Spring Boot Actuator配置:
management: endpoints: web: exposure: include: "*" endpoint: health: show-details: always- 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. 安全加固措施
必做安全清单:
- 修改默认密码(数据库、Redis)
- 关闭不必要的端口
- 定期更新系统补丁
- 配置防火墙规则
- 实施备份策略
敏感信息保护:
使用Vault管理密钥:
vault kv put secret/ruoyi mysql_password=xxx redis_password=xxxSpring 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: falseRedis连接池配置:
spring: redis: lettuce: pool: max-active: 20 max-idle: 10 min-idle: 5 max-wait: 3000在实际项目部署中,我们团队发现最大的性能瓶颈往往出现在数据库连接管理和缓存策略上。通过合理配置连接池参数和实现多级缓存(Redis + Caffeine),可以将系统吞吐量提升3-5倍。
