项目 Docker + Nginx 云端完整部署细节

整体架构拆分

  1. Nginx:部署前端 Vue 静态资源,反向代理后端 Java 接口、处理 HTTPS、请求限流、静态缓存
  2. Docker:容器化打包 SpringBoot 后端 Jar,隔离运行环境,一键启停、迁移、回滚
  3. 云服务器:阿里云 / 腾讯云 ECS,开放 80/443 端口,防火墙放行端口,域名解析指向公网 IP
  4. 配套: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. 后端容器关键细节(避坑)

  1. 环境配置隔离 :启动参数 --spring.profiles.active=prod 加载 application-prod.yml,本地密钥不打包进镜像;

  2. 支付证书持久化:微信 / 支付宝证书不要写死镜像,推荐挂载宿主机目录到容器,更新证书无需重新构建镜像;

  3. 时区统一 :Docker 默认 UTC 时区,容器内设置上海时区,避免订单时间错乱

    dockerfile

    复制代码
    RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone
  4. 日志持久化挂载:挂载宿主机日志目录,容器删除不丢失业务日志

  5. 内存限制 :低配置服务器限制 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 个目录,修改配置、替换前端、证书不用重建镜像:

  1. /opt/project/machinery-ec/front/usr/share/nginx/html:前端静态文件
  2. /opt/project/machinery-ec/nginx/nginx.conf/etc/nginx/nginx.conf:配置文件
  3. /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

五、部署全流程完整步骤

  1. 前端打包 Vue 项目执行 npm run build,生成 dist 文件夹,上传到服务器 /opt/project/machinery-ec/front

  2. 后端打包 Maven 打包 mvn clean package -DskipTests,target 下 jar 上传到 /opt/project/machinery-ec/backend/app.jar 微信支付 pem 证书放入 backend/cert

  3. SSL 证书上传 域名 SSL 证书放到 nginx/cert,无域名可暂时不用 HTTPS,仅开放 80 端口

  4. 构建后端镜像

    bash

    运行

    复制代码
    cd /opt/project/machinery-ec/backend
    docker build -t ec-backend:v1 .
  5. 一键启动容器

    bash

    运行

    复制代码
    cd /opt/project/machinery-ec
    docker-compose up -d
  6. 验证部署

    • 访问公网 IP / 域名:前端页面正常加载
    • 调用 /api/pay/create 接口,后端无 500 报错
    • 查看容器日志,无启动异常、数据库连接正常

六、生产环境核心细节 & 避坑

1. Nginx 专属业务细节

  1. Vue History 模式 404 :必须配置 try_files $uri $uri/ /index.html;
  2. 支付回调安全:回调接口单独 location,不做 token 拦截,增加 IP 白名单限制
  3. 静态资源缓存:js/css/img 配置 expires 缓存,减轻后端压力
  4. 隐藏版本号server_tokens off 关闭 Nginx 版本泄露
  5. 跨域处理:前后端分离出现跨域可在 Nginx 统一配置 CORS,无需后端修改代码

2. Docker 容器化部署细节

  1. 自动重启 :所有容器配置 restart: always,服务器断电重启自动恢复服务
  2. 数据挂载:日志、证书、配置全部宿主机挂载,容器删除数据不丢失
  3. 网络互通:使用自定义 compose 网络,Nginx 直接通过容器名访问后端,无需暴露 8080 到公网
  4. 版本迭代更新
    • 后端更新:上传新 jar → 重新 build 镜像 → docker-compose up -d 平滑更新
    • 前端更新:直接替换 front 目录文件 → docker-compose restart nginx 生效
  5. 资源隔离:低配置服务器限制 JVM 内存,避免容器占用全部内存导致服务器卡死

3. 支付模块部署重点(电商项目独有)

  1. 微信支付 pem 证书禁止打包进镜像,宿主机目录挂载,定期轮换证书无需重新构建镜像
  2. 生产配置 application-prod.yml 写入 Nacos 加密密钥,jar 包内不硬编码任何支付私钥
  3. 异步回调地址必须填写 https://域名/api/pay/notify,Nginx 强制 HTTPS,第三方平台只支持 HTTPS 回调
  4. 容器内时区统一 Asia/Shanghai,防止订单创建时间、支付时间时区偏差

4. 安全部署规范

  1. 后端 8080 端口不对外暴露,仅 Nginx 容器内网访问,公网只开放 80/443

  2. MySQL、Redis、RocketMQ 端口仅内网访问,安全组关闭公网放行

  3. 容器使用普通用户运行,禁止 root 权限启动服务

  4. 敏感配置文件 application-prod.yml 写入.gitignore,不提交代码仓库

  5. Nginx 限制单 IP 请求频率,防刷下单支付接口

  6. 定期清理 docker 无用镜像、容器,释放服务器磁盘空间 bash

    运行

    复制代码
    docker system prune -a

七、上线回滚方案(故障兜底)

  1. 后端回滚:保留旧版本镜像标签,故障时修改 compose 镜像版本,重启容器
  2. 前端回滚:备份上一版 dist 文件夹,直接覆盖 front 目录,重启 Nginx
  3. 容器快速关停:docker-compose down 一键停止所有服务,无残留进程
相关推荐
donoot18 小时前
一次 Nginx 502 问题的深度排查:从 SELinux 到容器网络
nginx·docker·selinux·反向代理·502 bad gateway
Sagittarius_A*20 小时前
Docker:渗透前置容器化核心基础
运维·安全·docker·容器
名字还没想好☜1 天前
Docker 多阶段构建:把镜像从 1.2GB 砍到 15MB
运维·docker·容器·多阶段构建·镜像优化
難釋懷1 天前
Nginx浏览器强制缓存
运维·nginx·缓存
花和满楼1 天前
K8s 1.36 ImageVolume GA:OCI 镜像不再只能跑容器
java·容器·kubernetes
生活爱好者!1 天前
NAS还能玩游戏?部署一款 WebGL 3D 赛车小游戏
游戏·docker·容器·玩游戏
曦月合一1 天前
本地电脑部署docker,及各种组件(nginx、mysql、redis、mongo、minio、java)
docker·windows10 专业版
hj2862511 天前
Docker 核心知识点整理(网络 + Dockerfile + 原理 + 命令)
网络·docker·容器
梦想的颜色1 天前
【Docker原理】Docker 容器一文打尽:生命周期、环境管控、迁移备份、日志进程排查、垃圾清理
运维·docker·容器·容器生命周期·容器日志排查·容器迁移备份·容器进程管理