整体架构拆分
- Nginx:部署前端 Vue 静态资源,反向代理后端 Java 接口、处理 HTTPS、请求限流、静态缓存
- Docker:容器化打包 SpringBoot 后端 Jar,隔离运行环境,一键启停、迁移、回滚
- 云服务器:阿里云 / 腾讯云 ECS,开放 80/443 端口,防火墙放行端口,域名解析指向公网 IP
- 配套:MySQL、Redis、RocketMQ 可容器部署或独立云数据库
一、前置服务器环境准备(云服务器操作)
1. 安装 Docker & Docker Compose
bash
运行
# CentOS
yum install docker -y
systemctl start docker
systemctl enable docker
# 安装docker-compose
curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
2. 防火墙 / 安全组放行端口
云服务器控制台安全组放行:80、443、3306、6379 服务器防火墙放行(firewalld):
bash
运行
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload
3. 项目目录规划(统一存放部署文件)
plaintext
/opt/project/machinery-ec/
├── front/ # 前端dist打包产物
│ ├── index.html
│ ├── js/ css/ img/
├── nginx/
│ ├── nginx.conf # Nginx配置文件
│ ├── cert/ # SSL证书文件
├── backend/
│ ├── app.jar # SpringBoot打包jar包
│ ├── Dockerfile # 后端镜像构建脚本
│ ├── cert/ # 微信支付pem证书
├── docker-compose.yml # 统一编排Nginx+后端容器
二、后端 SpringBoot Docker 容器部署细节
1. 编写后端 Dockerfile(/opt/project/machinery-ec/backend/Dockerfile)
dockerfile
# 基础JDK镜像 SpringBoot3 用jdk17
FROM openjdk:17-jdk-slim
# 设置工作目录
WORKDIR /app
# 复制jar包到容器内
COPY app.jar /app/app.jar
# 复制支付证书到容器
COPY cert/ /app/cert/
# 暴露项目端口(后端服务端口8080)
EXPOSE 8080
# 启动命令,指定生产环境配置
ENTRYPOINT ["java","-jar","app.jar","--spring.profiles.active=prod"]
2. 构建后端镜像 & 手动启动测试
bash
运行
# 进入后端目录
cd /opt/project/machinery-ec/backend
# 构建镜像,命名ec-backend
docker build -t ec-backend:v1 .
# 本地运行测试容器
docker run -d --name ec-server -p 8080:8080 ec-backend:v1
# 查看日志验证启动
docker logs -f ec-server
3. 后端容器关键细节(避坑)
-
环境配置隔离 :启动参数
--spring.profiles.active=prod加载application-prod.yml,本地密钥不打包进镜像; -
支付证书持久化:微信 / 支付宝证书不要写死镜像,推荐挂载宿主机目录到容器,更新证书无需重新构建镜像;
-
时区统一 :Docker 默认 UTC 时区,容器内设置上海时区,避免订单时间错乱
dockerfile
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone -
日志持久化挂载:挂载宿主机日志目录,容器删除不丢失业务日志
-
内存限制 :低配置服务器限制 JVM 内存,防止抢占服务器资源
bash
运行
ENTRYPOINT ["java","-Xms256m","-Xmx384m","-jar","app.jar"]
三、Nginx 部署前端 + 反向代理后端完整配置
1. Nginx 核心配置 nginx.conf
nginx
# 全局配置
worker_processes auto;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 负载均衡后端集群(单服务可省略)
upstream ec_backend {
server ec-server:8080; # docker容器互通,直接用容器名
}
# HTTP强制跳转HTTPS
server {
listen 80;
server_name 82.157.103.50 www.xxx.com;
return 301 https://$host$request_uri;
}
# HTTPS 443端口 正式访问
server {
listen 443 ssl;
server_name 82.157.103.50 www.xxx.com;
# SSL证书路径(宿主机挂载目录)
ssl_certificate /etc/nginx/cert/xxx.pem;
ssl_certificate_key /etc/nginx/cert/xxx.key;
ssl_protocols TLSv1.2 TLSv1.3;
# 前端静态资源访问
location / {
root /usr/share/nginx/html;
index index.html;
# Vue路由history模式必配,刷新404解决
try_files $uri $uri/ /index.html;
# 静态资源缓存,减少请求
expires 7d;
}
# 后端接口反向代理
location /api/ {
proxy_pass http://ec_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_connect_timeout 60s;
}
# 支付回调接口单独放行,不拦截登录校验
location /api/pay/notify/ {
proxy_pass http://ec_backend/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 关闭Nginx版本号隐藏,防止漏洞扫描
server_tokens off;
}
}
2. Nginx Docker 挂载说明(关键)
启动 Nginx 容器时必须挂载 3 个目录,修改配置、替换前端、证书不用重建镜像:
/opt/project/machinery-ec/front→/usr/share/nginx/html:前端静态文件/opt/project/machinery-ec/nginx/nginx.conf→/etc/nginx/nginx.conf:配置文件/opt/project/machinery-ec/nginx/cert→/etc/nginx/cert:SSL 证书
四、docker-compose.yml 一键编排(统一启动 Nginx + 后端)
yaml
version: "3"
services:
# 后端Java服务容器
backend:
image: ec-backend:v1
container_name: ec-server
restart: always # 服务器重启自动拉起
volumes:
# 挂载支付证书
- ./backend/cert:/app/cert
# 挂载日志持久化
- ./logs:/app/logs
networks:
ec-net:
# Nginx容器
nginx:
image: nginx:alpine
container_name: ec-nginx
restart: always
ports:
- "80:80"
- "443:443"
volumes:
# 挂载前端资源
- ./front:/usr/share/nginx/html
# 挂载配置文件
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
# 挂载SSL证书
- ./nginx/cert:/etc/nginx/cert
depends_on:
- backend # 先启动后端再启动Nginx
networks:
ec-net:
# 自定义容器网络,容器之间通过名称互通
networks:
ec-net:
Compose 启停命令
bash
运行
# 后台启动全部服务
docker-compose up -d
# 重启服务(修改nginx配置后执行)
docker-compose restart nginx
# 查看实时日志
docker-compose logs -f
# 停止所有容器
docker-compose down
五、部署全流程完整步骤
-
前端打包 Vue 项目执行
npm run build,生成 dist 文件夹,上传到服务器/opt/project/machinery-ec/front -
后端打包 Maven 打包
mvn clean package -DskipTests,target 下 jar 上传到/opt/project/machinery-ec/backend/app.jar微信支付 pem 证书放入backend/cert -
SSL 证书上传 域名 SSL 证书放到
nginx/cert,无域名可暂时不用 HTTPS,仅开放 80 端口 -
构建后端镜像
bash
运行
cd /opt/project/machinery-ec/backend docker build -t ec-backend:v1 . -
一键启动容器
bash
运行
cd /opt/project/machinery-ec docker-compose up -d -
验证部署
- 访问公网 IP / 域名:前端页面正常加载
- 调用
/api/pay/create接口,后端无 500 报错 - 查看容器日志,无启动异常、数据库连接正常
六、生产环境核心细节 & 避坑
1. Nginx 专属业务细节
- Vue History 模式 404 :必须配置
try_files $uri $uri/ /index.html; - 支付回调安全:回调接口单独 location,不做 token 拦截,增加 IP 白名单限制
- 静态资源缓存:js/css/img 配置 expires 缓存,减轻后端压力
- 隐藏版本号 :
server_tokens off关闭 Nginx 版本泄露 - 跨域处理:前后端分离出现跨域可在 Nginx 统一配置 CORS,无需后端修改代码
2. Docker 容器化部署细节
- 自动重启 :所有容器配置
restart: always,服务器断电重启自动恢复服务 - 数据挂载:日志、证书、配置全部宿主机挂载,容器删除数据不丢失
- 网络互通:使用自定义 compose 网络,Nginx 直接通过容器名访问后端,无需暴露 8080 到公网
- 版本迭代更新
- 后端更新:上传新 jar → 重新 build 镜像 →
docker-compose up -d平滑更新 - 前端更新:直接替换 front 目录文件 →
docker-compose restart nginx生效
- 后端更新:上传新 jar → 重新 build 镜像 →
- 资源隔离:低配置服务器限制 JVM 内存,避免容器占用全部内存导致服务器卡死
3. 支付模块部署重点(电商项目独有)
- 微信支付 pem 证书禁止打包进镜像,宿主机目录挂载,定期轮换证书无需重新构建镜像
- 生产配置
application-prod.yml写入 Nacos 加密密钥,jar 包内不硬编码任何支付私钥 - 异步回调地址必须填写
https://域名/api/pay/notify,Nginx 强制 HTTPS,第三方平台只支持 HTTPS 回调 - 容器内时区统一 Asia/Shanghai,防止订单创建时间、支付时间时区偏差
4. 安全部署规范
-
后端 8080 端口不对外暴露,仅 Nginx 容器内网访问,公网只开放 80/443
-
MySQL、Redis、RocketMQ 端口仅内网访问,安全组关闭公网放行
-
容器使用普通用户运行,禁止 root 权限启动服务
-
敏感配置文件
application-prod.yml写入.gitignore,不提交代码仓库 -
Nginx 限制单 IP 请求频率,防刷下单支付接口
-
定期清理 docker 无用镜像、容器,释放服务器磁盘空间 bash
运行
docker system prune -a
七、上线回滚方案(故障兜底)
- 后端回滚:保留旧版本镜像标签,故障时修改 compose 镜像版本,重启容器
- 前端回滚:备份上一版 dist 文件夹,直接覆盖 front 目录,重启 Nginx
- 容器快速关停:
docker-compose down一键停止所有服务,无残留进程