我正在运行一个 .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 通过 SSL 连接到 .NET gRPC 服务器的问题。以下是针对该问题的详细解答:
问题背景
提问者有一个正在运行的.NET 8 gRPC 服务器,在本地计算机上通过HTTP和HTTPS端口接受gRPC请求时一切正常。但是,当在DockerContainer中将服务器与NGINX一起运行时,只有HTTP端口有效, HTTPS端口响应502 Bad Gateway错误。
可能的原因及解决方案
• 问题:NGINX配置中的证书路径或证书本身可能存在问题,导致HTTPS连接失败。
• 解决方案:
•确保nginx.crt和nginx.key文件的路径正确,并且NGINX有权限访问这些文件。
• 检查证书是否有效且未过期。
• 问题:在Docker容器中,网络配置可能导致上游连接提前关闭。
• 解决方案:
• 检查Docker网络配置,确保容器之间的网络连接正常。
• 尝试在NGINX配置中增加keepalive参数,以保持与上游服务器的连接。
• 问题:.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环境中的所有配置都正确无误。