C# gRPC经Nginx反向代理大包触发upstream timed out 504错误如何解决
问题根因
你的配置有两个核心问题:一是Nginx的gRPC代理配置混用了普通HTTP代理的参数,二是HTTP/2和gRPC相关的缓冲、预读参数设置不合理,导致大体积请求传输时触发Nginx的流控或缓冲机制,最终超时。
具体修改方案
1. 修正Nginx配置
你当前的location块中大量proxy_*开头的参数是普通HTTP反向代理的配置,对grpc_pass完全无效,反而可能引发未知冲突,需要全部删除,同时补充gRPC专属的缓冲、HTTP/2相关配置,修改后的配置参考如下:
worker_processes auto; events { worker_connections 1024; } http { include mime.types; ssl_certificate nginx-selfsigned.crt; ssl_certificate_key nginx-selfsigned.key; # 调大HTTP/2请求体预读大小,避免大请求触发流控 http2_body_preread_size 10m; 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单条消息缓冲大小,避免频繁IO grpc_buffer_size 1m; grpc_read_timeout 250s; grpc_send_timeout 250s; output_buffers 4 320k; # Nginx >=1.19.1支持该参数,关闭gRPC请求缓冲,收到数据直接转发上游 grpc_request_buffering off; # 上游是自签名证书时关闭验证,避免握手失败 grpc_ssl_verify off; grpc_pass grpcs://localhost:30053; } } }
2. 补充ASP.NET Core gRPC服务配置
Kestrel的MaxRequestBodySize仅限制HTTP请求整体大小,gRPC服务本身还有单独的消息大小限制,虽然你当前180KB的请求没有触及默认4MB的阈值,但为了兼容更大的请求,建议在服务注册时添加配置:
builder.Services.AddGrpc(options => { // 按需调整最大接收/发送消息大小,这里设为10MB options.MaxReceiveMessageSize = 10 * 1024 * 1024; options.MaxSendMessageSize = 10 * 1024 * 1024; });
修改后重启Nginx和ASP.NET服务即可生效。
内容的提问来源于stack exchange,提问作者Teare
相关产品推荐
相关产品推荐

