现代化部署实战:Docker 容器化、Nginx 反向代理与 Serverless 快速上线

现代化部署实战:Docker 容器化、Nginx 反向代理与 Serverless 快速上线

Ethan
2025-07-20 发布 / 正在检测是否收录...

从写好代码到上线运行,中间隔着一道"部署"的鸿沟。本文将串联 Docker 容器化、Nginx 反向代理和 Serverless 平台部署,形成一条完整的现代化部署链路。

Dockerfile 最佳实践:多阶段构建

# 阶段 1:构建阶段
FROM maven:3.9-eclipse-temurin-21 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline -B     # 利用 Docker 缓存层
COPY src ./src
RUN mvn package -DskipTests -B

# 阶段 2:运行阶段(更小的镜像)
FROM eclipse-temurin:21-jre-alpine
RUN apk add --no-cache curl          # 健康检查工具
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
RUN addgroup -S app && adduser -S app -G app
USER app
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:8080/actuator/health || exit 1
ENTRYPOINT ["java", "-jar", "app.jar"]

多阶段构建的好处:最终镜像只包含 JRE 和 JAR(约 200MB),而非带 Maven 和源码的构建环境(1GB+)。分层缓存——pom.xml 单独 COPY,依赖下载被缓存,代码改动时无需重新下载依赖。

Docker Compose 本地编排

# docker-compose.yml
services:
  nginx:
    image: nginx:alpine
    ports: ["80:80", "443:443"]
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./ssl:/etc/nginx/ssl
    depends_on: [backend]

  backend:
    build: .
    environment:
      - SPRING_PROFILES_ACTIVE=docker
    depends_on: [mysql, redis]

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_DATABASE: myblog
    volumes: [mysql_data:/var/lib/mysql]

  redis:
    image: redis:7-alpine
    volumes: [redis_data:/data]

volumes:
  mysql_data:
  redis_data:

Nginx 反向代理:核心配置

# nginx.conf
upstream backend {
    server backend1:8080 weight=3;
    server backend2:8080 weight=1;
    keepalive 32;
}

server {
    listen 80;
    server_name blog.example.com;
    return 301 https://$host$request_uri;     # HTTP 强制跳转 HTTPS
}

server {
    listen 443 ssl http2;
    server_name blog.example.com;
    ssl_certificate     /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    # 安全头
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;

    # API 代理
    location /api/ {
        proxy_pass http://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;
    }

    # 静态资源(Nginx 直接处理,不经过后端)
    location /static/ {
        root /var/www/html;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

Serverless 平台快速上线

# 阿里云 Serverless 应用引擎(SAE)配置
edition: 3.0.0
name: my-app
resources:
  backend:
    component: aliyun_sae
    props:
      namespace_id: cn-hangzhou:prod
      app_name: my-backend
      cpu: 2
      memory: 4
      replicas: 3
      package:
        type: image
        image: registry.cn-hangzhou.aliyuncs.com/myapp/backend:latest
      sls_conf:
        enable: true
      auto_config: true

Serverless vs 传统部署:消除服务器运维、按需付费、弹性伸缩秒级扩容。

总结

Docker 解决了"环境一致性"问题,Nginx 解决了"流量入口"问题,Serverless 解决了"运维效率"问题。三者结合:Dockerfile 定义环境 → Docker Compose 本地编排 → CI/CD 自动构建镜像 → Serverless 平台一键部署

© 版权声明
THE END
喜欢就支持一下吧
点赞 1 分享 收藏

评论 (0)

取消

Warning: file_put_contents(/var/www/html/usr/cache/pagecache/eb/eb3b56f77df62f60fec7af61264065cc.cache): failed to open stream: No such file or directory in /var/www/html/usr/plugins/PageCache/Plugin.php on line 188