C# & nginx - 上游超时

C# & nginx - upstream timed out

我的 grpc 连接和 nginx 有问题。

所以,我有这些东西:一个客户端,一个服务器,nginx。他们都 运行 在同一台机器上。

客户端进行了一些网络扫描,应该将其结果发送到服务器,

服务器应该获取扫描结果并将它们放入数据库中。服务器基于 ASP.Net - 请参阅 appsettings.json 客户端和服务器使用带有“protobuf”的“grpc-dotnet”。两者都使用 SSL 证书,通常它们都按预期工作。

nginx 代理应该用作反向代理 -> 客户端只需要为所有请求知道一个端点。 Nginx只配置为传递grpc请求,没有别的。

首先,几乎所有的 grpc 请求都有效。但如果请求太大,它们就会停止工作。我不知道确切的大小,但它必须在 180kb 以下。

(180kb 是扫描的大小 results.In 一个测试,发送这些结果的一半成功,发送所有结果都没有。自定义测试数据(当然具有相同的 class)确实显示相同的结果。如果它们太大,它就会停止工作)

没有nginx,从客户端向服务器发送数据时没有错误。 但是,使用 nginx,客户端确实会收到 HTTP 504 错误。

error.log (nginx) 的内容

2021/07/27 13:27:28 [error] 21464#7952: *66 upstream timed out (10060: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat) while sending request to upstream, client: 127.0.0.1, server: , request: "POST /UI.Remoting.Discovery.Contract.DiscoveryService/SaveDiscoveryResult HTTP/2.0", upstream: "grpcs://127.0.0.1:30053", host: "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 verbundene Host nicht reagiert hat”翻译为:

A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond


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);
}

我缺少/做错了什么配置?

看来当前的nginx版本确实存在bug。我在 nginx 的票务系统中发布了一张新票。 https://trac.nginx.org/nginx/ticket/2229