【发布时间】:2021-07-27 14:56:28
【问题描述】:
我的 grpc 连接和 nginx 有问题。
所以,我有这些东西:客户端、服务器、nginx。它们都在同一台机器上运行。
客户端进行一些网络扫描,并应该将其结果发送到服务器,
服务器应该获取扫描结果并将它们放入数据库。服务器基于 ASP.Net - 请参阅 appsettings.json 客户端和服务器使用“grpc-dotnet”和“protobuf”。两者也都使用 SSL 证书,并且通常它们都按预期工作。
nginx 代理应该用作反向代理 -> 客户端只需要知道他们所有请求的一个端点。 Nginx 只配置为传递 grpc 请求,没有别的。
首先,几乎所有 grpc 请求都有效。但是如果请求太大,它们就会停止工作。我不知道确切的大小,但它必须在 180kb 以下。
(180kb 是扫描结果的大小。在测试中,发送这些结果的一半成功,而发送全部失败。自定义测试数据(当然是同一类)确实显示了相同的结果。如果他们得到了太大,它停止工作)
没有 nginx,从客户端向服务器发送数据时不会出错。 但是,使用 nginx 时,客户端确实会收到 HTTP 504 错误。
error.log 的内容(nginx)
2021/07/27 13:27:28 [错误] 21464#7952: *66 上游超时 (10060: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht Richtig reagiert hat, oder die hergestellte Verbindung 战争fehlerhaft, da der verbundene Host nicht reagiert hat) 向上游发送请求时,客户端:127.0.0.1,服务器:,请求:“POST /UI.Remoting.Discovery.Contract.DiscoveryService/SaveDiscoveryResult HTTP/2.0”,上游:“grpcs ://127.0.0.1:30053",主机:"localhost:30051"
“Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbindene Host nicht reagiert hat”翻译为:
连接尝试失败,因为连接方在一段时间后没有正确响应,或者连接失败,因为连接的主机没有响应
nginx.conf - 我确实尝试了很多配置 - 它们并没有解决我的问题。 下面显示的配置只是为了向您展示我测试过的配置,但可能会遗漏一些。我已经在多种不同的安排中对它们进行了测试,并有选择地测试了不同区域(服务器、http、位置)中的每种配置
worker_processes auto;
events {
worker_connections 1024;
}
http {
include mime.types;
ssl_certificate nginx-selfsigned.crt;
ssl_certificate_key nginx-selfsigned.key;
server {
listen 30051 ssl http2;
client_header_buffer_size 16k;
client_header_timeout 250s;
location /UI.Remoting.Discovery.Contract.DiscoveryService{
client_max_body_size 1000m;
client_body_buffer_size 48k;
client_body_timeout 250s;
keepalive_timeout 250s;
grpc_buffer_size 4k;
grpc_read_timeout 250s;
grpc_send_timeout 250s;
output_buffers 4 320k;
proxy_request_buffering off;
proxy_buffering off;
proxy_cache_convert_head off;
proxy_connect_timeout 250s;
proxy_headers_hash_max_size 1024;
proxy_socket_keepalive off;
proxy_send_timeout 250s;
proxy_read_timeout 250s;
grpc_pass grpcs://localhost:30053;
}
}
}
服务器 - appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"Kestrel": {
"Limits": {
"MaxRequestBodySize": null // Other settings did not seem to affect anything
},
"Endpoints": {
"HttpsInlineCertFile": {
"Url": "https://localhost:30053",
"Protocols": "Http2",
"Certificate": {
"Path": "Cert/nginx-selfsigned.pfx",
"Password": "<insert pw here>"
}
}
}
}
}
DiscoveryService 接口
[ServiceContract]
public interface IDiscoveryService
{
ValueTask<SaveDiscoveryResultResponse> SaveDiscoveryResultAsync(SaveDiscoveryResultRequest request);
}
将 SaveDiscoveryResultAsync 重新实现到流并没有成功
[ServiceContract]
public interface IDiscoveryService
{
ValueTask<SaveDiscoveryResultResponse> SaveDiscoveryResultAsync(IAsyncEnumerable<SaveDiscoveryResultRequest> request);
}
我缺少什么配置/做错了什么?
【问题讨论】:
-
我创建了一个反映我的错误的示例项目:github.com/xTeare/GrpcAndNGINX
标签: c# asp.net nginx grpc nginx-reverse-proxy