基于Docker与Nginx的AWS部署:SSL证书配置问题咨询
配置方案:启用自签名SSL并修复Nginx路由
一、先明确两个Nginx的职责(避免路由冲突)
默认按以下架构调整(如果你的实际架构不同,可对应修改路由逻辑):
- 外层Nginx:对外暴露HTTPS端口,负责SSL终止,同时转发API请求到Node服务、前端请求到内层Nginx
- 内层Nginx:仅处理React前端的静态资源与SPA路由 fallback
二、修改docker-compose.yml配置
- 映射外层Nginx的443(HTTPS)和80(HTTP重定向)端口
- 挂载自签名证书目录到外层Nginx容器
- 确保服务间网络互通
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;"]
六、关键注意事项
- 证书路径校验:本地
ssl/目录必须包含server.crt和server.key文件,且docker-compose挂载路径与Nginx配置一致 - AWS安全组:开放443(HTTPS)和80(HTTP)端口,否则外部无法访问
- Node服务监听设置:Node代码需监听
0.0.0.0而非localhost,例如:app.listen(3000, '0.0.0.0'),确保容器间可访问 - 浏览器信任证书:自签名证书会被浏览器标记为不安全,测试时需手动添加信任(生产环境请使用CA签发的证书)
内容的提问来源于stack exchange,提问作者Nithin_Kamineni
相关产品推荐
相关产品推荐

