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 - 上游超时的主要内容,如果未能解决你的问题,请参考以下文章

NGINX:从上游读取响应头时上游超时(110:连接超时)

代理到 Node/Express 上游时不常见的 NGINX 错误/超时(连接到上游时上游超时)

上游超时(uWSGI + NGINX + Flask)

*10 上游超时(110:连接超时),同时使用 uwsgi 从上游读取响应头

nginx 故障转移

Nginx 反向代理导致 504 网关超时