You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 18:27:03