前后端全链路 HTTPS 的完整配置方案,涵盖 Nginx 前端 HTTPS 托管、webgateway 网关 HTTPS、内部服务安全通信,基于 Docker Compose 实现,包含证书生成、配置文件、验证步骤,可直接参考部署。

一、整体架构说明
       前端:Vue/React 静态文件由 Nginx 托管,Nginx 处理 HTTPS(443 端口),对外提供前端访问和 API 反向代理。
       网关(webgateway):.NET Core 服务,启用 HTTPS(容器内 443 端口),接收 Nginx 代理的 API 请求,转发到内部服务。
       证书:使用自签证书(测试用),生产环境需替换为 CA 颁发证书;Nginx 用crt/key格式,webgateway 用pfx格式,共用证书目录。

二、证书创建

# 1. 创建证书目录
mkdir -p ./web/nginx/ssl

# 2. 生成Nginx用的 crt/key 证书(有效期365天)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout cert.key -out cert.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=Test/OU=IT/CN=192.168.1.185"

# 3. 转换为webgateway用的 pfx 证书(密码123456,需与配置一致)
openssl pkcs12 -export -out webgateway.pfx -inkey cert.key -in cert.crt -password pass:123456

二、前端部署https

1、新建web文件夹,在文件夹下新建dist、nginx文件夹;

   发布的前端代码放入dist目录;

2、nginx文件夹下新建conf.d文件夹与ssl文件夹

    conf.d文件夹下新建default.conf文件挂载Nginx配置;ssl文件存放证书相关

使用反向代理:

# 443 端口:处理 HTTPS 业务请求(前端+API)
server {
    listen 443 ssl;
    server_name 172.16.34.40;  # 宿主机IP或域名(生产环境填真实域名)

    # SSL 证书配置(已生成的 cert.crt 和 cert.key)
    ssl_certificate     /etc/nginx/ssl/cert.crt;
    ssl_certificate_key /etc/nginx/ssl/cert.key;

    # SSL 安全优化(保持不变)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # API 代理(后端接口)
    location /api/ {
        proxy_pass https://webgateway:443/;

        # 传递客户端真实信息给后端(关键!)
        proxy_set_header Host $host;                     # 传递原始Host头
        proxy_set_header X-Real-IP $remote_addr;         # 客户端真实IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 代理链IP
        proxy_set_header X-Forwarded-Proto $scheme;      # 原始协议(HTTPS)
        proxy_set_header X-Forwarded-Port $server_port;  # 原始端口(443)
        
    }

    # 前端静态文件
    location / {
        root /usr/share/nginx/html;
        index index.html;
        try_files $uri $uri/ /index.html;  # 解决前端路由 404
    }
}

不用反向代理:

# ==============================================
# 443 端口:spc.web HTTPS
# ==============================================
server {
    listen 443 ssl;
    server_name 172.16.34.40;

    ssl_certificate     /etc/nginx/ssl/cert.crt;
    ssl_certificate_key /etc/nginx/ssl/cert.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location / {
        root /usr/share/nginx/html/spc.web/dist;
        index index.html;
        try_files $uri $uri/ /index.html;
    }
}

# ==============================================
# 8081 端口:pos.3d HTTP
# ==============================================
server {
    listen 8081;
    server_name 172.16.34.40;

    location / {
        root /usr/share/nginx/html/pos.3d/dist;
        index index.html;
        try_files $uri $uri/ /index.html;
    }
}

# ==============================================
# 8082 端口:spc.3d HTTP
# ==============================================
server {
    listen 8082;
    server_name 172.16.34.40;

    location / {
        root /usr/share/nginx/html/spc.3d/dist;
        index index.html;
        try_files $uri $uri/ /index.html;
    }
}

3、web文件夹下新建Dockerfile文件、内容如下:

# 基于官方 Nginx 镜像
FROM nginx:1.25

# 删除默认配置
RUN rm -rf /etc/nginx/conf.d/default.conf

# 复制三个前端项目到镜像里
COPY ./spc.web/dist /usr/share/nginx/html/spc.web/dist
COPY ./pos.3d/dist /usr/share/nginx/html/pos.3d/dist
COPY ./spc.3d/dist /usr/share/nginx/html/spc.3d/dist

# 复制Nginx配置
COPY ./nginx/conf.d/default.conf /etc/nginx/conf.d/

# 复制证书
COPY ./nginx/ssl /etc/nginx/ssl

# 时区
ENV TZ=Asia/Shanghai

三、后端部署https

1、发布的代码放入publish文件夹;

2、congig文件夹中appsettings.json新增节点:

 "Kestrel": {
    "Endpoints": {
		//HTTP 端点(保留原 80 端口,兼容旧访问)
      "Http": {
        "Url": "http://*:80"  // 容器内 HTTP 端口,和之前一致
      },
	   //HTTPS 端点
      "Https": {
        "Url": "https://*:443",  //容器内HTTPS监听443端口(与Docker Compose一致)
        "Certificate": {
          "Path": "/app/ssl/webgateway.pfx",  // 容器内 PFX 证书路径(后续 Docker 会挂载)
          "Password": "123456"  // 第一步设置的证书密码,必须一致!
        }
      }
    }
  }

program.cs 不能配置Kestrel相关;

(2)Dockerfile文件内容如下:

# 使用官方 ASP.NET Core 运行时镜像
FROM mcr.microsoft.com/dotnet/aspnet:7.0
WORKDIR /app
COPY ./publish .
EXPOSE 443
ENTRYPOINT ["dotnet", "SPC.WebGateway.dll"]

(3)docker-compose.yml配置文件如下:

version: "3.8"

#外部访问网 + 内部服务网)
networks:
  public-net:  # 外部访问网:只让webgateway加入,对外暴露
    driver: bridge
  internal-net:  # 内部服务网:所有服务内部通信,不对外暴露
    driver: bridge


services: #服务
  web-nginx:  # 服务名称(自定义)
    image: web-nginx:1.0
    container_name: web-nginx  # 容器名称
    build: ./web
    restart: always  # 自动重启策略(异常退出/开机后自动启动)
    ports:
      - "443:443"    # spc.web HTTPS
      - "8081:8081"  # pos.3d HTTP
      - "8082:8082"  # spc.3d HTTP
    volumes:
      # 挂载1:本地静态文件(3个前端全部挂载)
      - ./web:/usr/share/nginx/html  # 只改这一行,托管所有前端
      # 挂载2:自定义 Nginx 配置文件(覆盖默认配置)
      - ./web/nginx/conf.d:/etc/nginx/conf.d  # 存放 *.conf 配置文件
      # 挂载3:HTTPS 证书(如需)
      - ./web/nginx/ssl:/etc/nginx/ssl  # 存放 .crt 和 .key 文件
    environment:
      - TZ=Asia/Shanghai  # 时区配置(确保日志时间正确)
    logging: # 日志设置
      driver: json-file
      options:
        max-size: 10m  # 单个日志文件的大小,到达这个值后会进行日志滚动
        max-file: '3'    # 日志文件保留的数量
    networks:
     - public-net   # 对外的网络
     - internal-net # 对内的网络
      
  webgateway:
    image: webgateway:1.0
    container_name: webgateway  #容器名
    restart: always  #重启docker引擎后该容器也重启
    build: ./webgateway #构建 文件目录
    ports:
      # HTTP 端口映射(宿主机 55001 → 容器 80)
      - "55000:80"  
      # 原有:HTTPS 端口映射(宿主机 55443 → 容器 443,不变)
      - "55443:443"
    hostname: webgateway #主机名
    volumes:
      - ./webgateway/Logs:/app/Logs
      - ./webgateway/config/appsettings.json:/app/appsettings.json
      - ./webgateway/config/ocelot.json:/app/ocelot.json
      - ./webgateway/config/licenses/diw.license:/app/licenses/diw.license
      - ./webgateway/config/licenses/public.xml:/app/licenses/public.xml
      # 新增:挂载 PFX 证书到容器内 /app/ssl 目录(和 appsettings 配置的路径对应)
      - ./web/nginx/ssl:/app/ssl:ro  # 只读挂载,和 Nginx 共用证书目录
    environment: #环境变量
      - TZ=Asia/Shanghai #时区
    logging: # 日志设置
      driver: json-file
      options:
        max-size: 10m  # 单个日志文件的大小,到达这个值后会进行日志滚动
        max-file: '3'    # 日志文件保留的数量
    networks:
     - public-net   # 对外的网络
     - internal-net # 对内的网络

  authserver:
    image: authserver:1.0
    build: ./authserver
    container_name: authserver
    restart: always
    ports:
      - 55001:80
    hostname: authserver
    volumes:
      - ./authserver/Logs:/app/Logs
      - ./authserver/config/appsettings.json:/app/appsettings.json
    environment:
      - ASPNETCORE_URLS=http://+:80
      - TZ=Asia/Shanghai
    logging: # 日志设置
      driver: json-file
      options:
        max-size: 10m
        max-file: '3'
    networks:
     - public-net   # 对外的网络
     - internal-net # 对内的网络

  plantdata: 
    image: plantdata:1.0
    build: ./plantdata
    container_name: plantdata
    restart: always
    ports:
      - 55002:80
    hostname: plantdata
    volumes:
      - ./plantdata/Logs:/app/Logs
      - ./plantdata/config/appsettings.json:/app/appsettings.json
    environment:
      - ASPNETCORE_URLS=http://+:80
      - TZ=Asia/Shanghai
    logging: # 日志设置
      driver: json-file
      options:
        max-size: 10m
        max-file: '3'
    networks:
     - public-net   # 对外的网络
     - internal-net # 对内的网络
     # 数据服务健康检查:访问 /health 接口
    healthcheck:
      test: ["CMD", "curl", "-s", "http://localhost:80/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s

4、后端如果需要同时兼容http和https需要删除环境变量配置的443端口整个一行;

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐