C# & nginx - 上游超时
Posted
技术标签:
【中文标题】C# & nginx - 上游超时【英文标题】:C# & nginx - upstream timed out 【发布时间】: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 【参考方案1】:当前的 nginx 版本中似乎确实存在错误。我在 nginx 的票务系统中发布了一张新票。 https://trac.nginx.org/nginx/ticket/2229
【讨论】:
以上是关于C# & nginx - 上游超时的主要内容,如果未能解决你的问题,请参考以下文章
代理到 Node/Express 上游时不常见的 NGINX 错误/超时(连接到上游时上游超时)