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

发布时间:2026/7/11 20:31:25
项目 Docker + Nginx 云端完整部署细节 整体架构拆分Nginx部署前端 Vue 静态资源反向代理后端 Java 接口、处理 HTTPS、请求限流、静态缓存Docker容器化打包 SpringBoot 后端 Jar隔离运行环境一键启停、迁移、回滚云服务器阿里云 / 腾讯云 ECS开放 80/443 端口防火墙放行端口域名解析指向公网 IP配套MySQL、Redis、RocketMQ 可容器部署或独立云数据库一、前置服务器环境准备云服务器操作1. 安装 Docker Docker Composebash运行# 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-compose2. 防火墙 / 安全组放行端口云服务器控制台安全组放行80、443、3306、6379服务器防火墙放行firewalldbash运行firewall-cmd --add-port80/tcp --permanent firewall-cmd --add-port443/tcp --permanent firewall-cmd --reload3. 项目目录规划统一存放部署文件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/Dockerfiledockerfile# 基础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.activeprod]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-server3. 后端容器关键细节避坑环境配置隔离启动参数--spring.profiles.activeprod加载application-prod.yml本地密钥不打包进镜像支付证书持久化微信 / 支付宝证书不要写死镜像推荐挂载宿主机目录到容器更新证书无需重新构建镜像时区统一Docker 默认 UTC 时区容器内设置上海时区避免订单时间错乱dockerfileRUN 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.confnginx# 全局配置 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/certSSL 证书四、docker-compose.yml 一键编排统一启动 Nginx 后端yamlversion: 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 -DskipTeststarget 下 jar 上传到/opt/project/machinery-ec/backend/app.jar微信支付 pem 证书放入backend/certSSL 证书上传域名 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生效资源隔离低配置服务器限制 JVM 内存避免容器占用全部内存导致服务器卡死3. 支付模块部署重点电商项目独有微信支付 pem 证书禁止打包进镜像宿主机目录挂载定期轮换证书无需重新构建镜像生产配置application-prod.yml写入 Nacos 加密密钥jar 包内不硬编码任何支付私钥异步回调地址必须填写https://域名/api/pay/notifyNginx 强制 HTTPS第三方平台只支持 HTTPS 回调容器内时区统一 Asia/Shanghai防止订单创建时间、支付时间时区偏差4. 安全部署规范后端 8080 端口不对外暴露仅 Nginx 容器内网访问公网只开放 80/443MySQL、Redis、RocketMQ 端口仅内网访问安全组关闭公网放行容器使用普通用户运行禁止 root 权限启动服务敏感配置文件application-prod.yml写入.gitignore不提交代码仓库Nginx 限制单 IP 请求频率防刷下单支付接口定期清理 docker 无用镜像、容器释放服务器磁盘空间bash运行docker system prune -a七、上线回滚方案故障兜底后端回滚保留旧版本镜像标签故障时修改 compose 镜像版本重启容器前端回滚备份上一版 dist 文件夹直接覆盖 front 目录重启 Nginx容器快速关停docker-compose down一键停止所有服务无残留进程