首页 > 解决方案 > Azure 容器实例上的 Net Core 3.1 gRPC 服务器仅侦听端口 80

问题描述

容器属性容器 日志

    FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
    WORKDIR /app
    EXPOSE 80
    EXPOSE 443
    EXPOSE 5001
    
    FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
    WORKDIR /src
    COPY ["GrpcService/GrpcService.csproj", "GrpcService/"]
    RUN dotnet restore "GrpcService/GrpcService.csproj"
    COPY . .
    WORKDIR "/src/GrpcService"
    RUN dotnet build "GrpcService.csproj" -c Release -o /app/build
    
    FROM build AS publish
    RUN dotnet publish "GrpcService.csproj" -c Release -o /app/publish
    
    FROM base AS final
    WORKDIR /app
    COPY --from=publish /app/publish .
    ENTRYPOINT ["dotnet", "GrpcService.dll"]

Azure 容器状态

标签: azure-container-instances

解决方案


正如我所读到的,VS 使用开发人员证书在 localhost 上启用 SSL,这就是在 Docker Desktop 上打开端口的原因;但是当为部署构建 Docker 映像时,ASP 基础映像与 gRPC 服务器合并,因为没有证书,只打开端口 80

解决方案是使用反向代理:https ://docs.microsoft.com/en-us/azure/container-instances/container-instances-container-group-ssl

基于 Nginx gRPC 支持:https ://www.nginx.com/blog/nginx-1-13-10-grpc/ 需要对 nginx.conf 文件进行一些调整

server {
    listen [::]:5001 ssl http2;
    listen 5001 ssl http2;

    server_name localhost;

    ssl_protocols              TLSv1.2;

    ssl_ciphers     ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:AES128:AES256:RC4-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK;
    ssl_prefer_server_ciphers  on;

    ssl_session_cache    shared:SSL:10m; 
    ssl_session_timeout  24h;

    keepalive_timeout 300; 

    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains';

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

    location / {
        grpc_pass grpc://localhost:80;
    }
}

在 Deploy YAML 上添加 DNS 标签也很有用,因为 ip 地址可能会在容器映像更新时发生变化

ipAddress:
dnsNameLabel: mydnslabel
ports:
- port: 5001
  protocol: TCP
type: Public

推荐阅读