You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Docker与Nginx的AWS部署:SSL证书配置问题咨询

配置方案:启用自签名SSL并修复Nginx路由

一、先明确两个Nginx的职责(避免路由冲突)

默认按以下架构调整(如果你的实际架构不同,可对应修改路由逻辑):

  • 外层Nginx:对外暴露HTTPS端口,负责SSL终止,同时转发API请求到Node服务、前端请求到内层Nginx
  • 内层Nginx:仅处理React前端的静态资源与SPA路由 fallback

二、修改docker-compose.yml配置

  1. 映射外层Nginx的443(HTTPS)和80(HTTP重定向)端口
  2. 挂载自签名证书目录到外层Nginx容器
  3. 确保服务间网络互通
version: '3.8'

services:
  # 外层Nginx:处理SSL与全局路由
  nginx-proxy:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx-proxy.conf:/etc/nginx/conf.d/default.conf
      # 挂载本地证书目录(需提前把自签名的crt/key放这里)
      - ./ssl:/etc/nginx/ssl
    depends_on:
      - nginx-frontend
      - node-api
    networks:
      - app-network

  # 内层Nginx:处理React前端路由
  nginx-frontend:
    build: ./frontend
    volumes:
      - ./frontend/build:/usr/share/nginx/html
    networks:
      - app-network

  # Nodejs API服务
  node-api:
    build: ./backend
    environment:
      - DB_HOST=postgres
      - DB_USER=your-db-user
      - DB_PASS=your-db-pass
      - DB_NAME=your-db-name
    depends_on:
      - postgres
    networks:
      - app-network

  postgres:
    image: postgres:14-alpine
    environment:
      - POSTGRES_USER=your-db-user
      - POSTGRES_PASSWORD=your-db-pass
      - POSTGRES_DB=your-db-name
    volumes:
      - postgres-data:/var/lib/postgresql/data
    networks:
      - app-network

volumes:
  postgres-data:

networks:
  app-network:
    driver: bridge

三、修改外层Nginx配置(nginx-proxy.conf)

配置SSL终止、HTTP转HTTPS重定向,以及路由转发规则:

# HTTP 80端口:强制重定向到HTTPS
server {
    listen 80;
    server_name _; # 匹配所有域名,也可指定你的AWS实例域名

    return 301 https://$host$request_uri;
}

# HTTPS 443端口:处理SSL与路由转发
server {
    listen 443 ssl;
    server_name _;

    # 自签名证书路径(对应docker-compose挂载的目录)
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;

    # SSL基础配置(适配自签名证书)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # 转发API请求到Node服务(替换为你的Node服务端口)
    location /api/ {
        proxy_pass http://node-api:3000/;
        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;
    }

    # 转发前端请求到内层Nginx
    location / {
        proxy_pass http://nginx-frontend:80/;
        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;

        # SPA路由fallback(React/Vue等单页应用必需)
        try_files $uri $uri/ /index.html;
    }
}

四、修改内层Nginx配置(前端目录下的nginx-frontend.conf)

内层Nginx仅处理静态资源与SPA路由,无需配置SSL:

server {
    listen 80;
    server_name localhost;

    root /usr/share/nginx/html;
    index index.html;

    # SPA路由fallback
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 静态资源缓存优化(可选)
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}

五、前端Dockerfile调整

确保正确构建React应用并替换Nginx默认配置:

# 构建阶段
FROM node:18-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 生产阶段
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
# 替换为自定义的前端路由配置
COPY nginx-frontend.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

六、关键注意事项

  1. 证书路径校验:本地ssl/目录必须包含server.crt和server.key文件,且docker-compose挂载路径与Nginx配置一致
  2. AWS安全组:开放443(HTTPS)和80(HTTP)端口,否则外部无法访问
  3. Node服务监听设置:Node代码需监听0.0.0.0而非localhost,例如:app.listen(3000, '0.0.0.0'),确保容器间可访问
  4. 浏览器信任证书:自签名证书会被浏览器标记为不安全,测试时需手动添加信任(生产环境请使用CA签发的证书)

内容的提问来源于stack exchange,提问作者Nithin_Kamineni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 20:44:51