如何使用 SSL 正确配置 NGINX for gRPC 以连接到 .NET gRPC 服务器?

问题描述 投票:0回答:1

我正在运行一个 .NET 8 gRPC 服务器。由于它处于测试阶段,我将其配置为接受 HTTP

5000
和 HTTPS
12345
端口上的 gRPC 请求。在我的本地机器上一切正常。

但是,当我在 Docker 容器中运行服务器和 NGINX 时,只有 HTTP 端口可以工作。 HTTPS 端口响应 502 Bad Gateway 错误。

2024/11/29 01:31:27 [error] 30#30: *1 upstream prematurely closed connection while reading response header from upstream, client: 172.19.0.1, server: grpcgateway, request: "POST /xxxx/Register HTTP/2.0", upstream: "grpc://172.19.0.4:12345", host: "localhost:12345
172.19.0.1 - - [29/Nov/2024:01:31:27 +0000] "POST /xxxx/Register HTTP/2.0" 502 157 "-" "grpc-node-js/1.8.10"

我的配置有问题吗?

以下是我的 .NET 服务器和 NGINX 的配置。

var serverCert = X509Certificate2.CreateFromPemFile("Credentials/nginx.crt", "Credentials/nginx.key");
option.ListenAnyIP(5000, o =>
{
    o.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2;
});
option.ListenAnyIP(12345, o => o.UseHttps(httpsOptions =>
    {
        httpsOptions.ServerCertificate = serverCert;
    }
));
worker_processes auto;
 
events {
    worker_connections 1024;
}
 
http {
    include       mime.types;
    default_type  application/octet-stream;
    
    ssl_certificate      /etc/nginx/nginx.crt;
    ssl_certificate_key  /etc/nginx/nginx.key;
    
    server {
        listen 12345 ssl http2;
        server_name grpcgateway;
        default_type application/grpc;

        ssl_session_cache builtin:1000 shared:SSL:10m;
        ssl_session_timeout  5m;

        location / {
           grpc_set_header X-Forwarded-For $remote_addr;
           grpc_pass grpc://abc-server:12345;
        }
    }

    server {
        listen 5000 http2;
        server_name grpcgateway;
        default_type application/grpc;

        location / {
           grpc_set_header X-Forwarded-For $remote_addr;
           grpc_pass grpc://abc-server:5000;
        }
    }
}

PS:我的证书并不重要,我什至想绕过它们进行测试。

nginx .net-core docker-compose grpc
1个回答
0
投票

此图片展示了一个网页,内容是关于如何正确配置 NGINX 通过 SSL 连接到 .NET gRPC 服务器的问题。以下是针对该问题的详细解答:

问题背景

提问者有一个正在运行的.NET 8 gRPC 服务器,在本地计算机上通过HTTP和HTTPS端口接受gRPC请求时一切正常。但是,当在DockerContainer中将服务器与NGINX一起运行时,只有HTTP端口有效, HTTPS端口响应502 Bad Gateway错误。

可能的原因及解决方案

  1. 证书配置问题

• 问题:NGINX配置中的证书路径或证书本身可能存在问题,导致HTTPS连接失败。

• 解决方案:

•确保nginx.crt和nginx.key文件的路径正确,并且NGINX有权限访问这些文件。

• 检查证书是否有效且未过期。

  1. 网络配置问题

• 问题:在Docker容器中,网络配置可能导致上游连接提前关闭。

• 解决方案:

• 检查Docker网络配置,确保容器之间的网络连接正常。

• 尝试在NGINX配置中增加keepalive参数,以保持与上游服务器的连接。

  1. gRPC 配置问题

• 问题:.NET gRPC 服务器在 Docker 环境中的配置可能与本地环境不同,导致 HTTPS 连接失败。

• 解决方案:

•确保.NET gRPC 服务器在 Docker 环境中的配置与本地环境一致,特别是与 SSL 相关的配置。

• 检查.NET gRPC 服务器的日志,查看是否有与 SSL 连接相关的错误信息。

NGINX 配置示例

以下是一个基本的NGINX配置示例,用于通过SSL连接到gRPC服务器:

server {
    listen 443 ssl;
    server_name your_domain.com;

    ssl_certificate /path/to/nginx.crt;
    ssl_certificate_key /path/to/nginx.key;

    location / {
        grpc_pass grpc://your_gprc_server_ip:your_gprc_server_port;
        error_page 502 = @grpc_fallback;
    }

    location @grpc_fallback {
        internal;
        proxy_pass http://your_gprc_server_ip:your_gprc_server_port;
    }
}

请注意,上述配置中的/path/to/nginx.crt和/path/to/nginx.key应替换为实际的证书路径,your_gprc_server_ip和your_gprc_server_port应替换为实际的gRPC服务器IP和端口。

总结

解决这个问题的关键在于仔细检查证书配置、网络配置和gRPC服务器配置,确保在Docker环境中的所有配置都正确无误。

© www.soinside.com 2019 - 2024. All rights reserved.