Nginx 1.18反向代理GRPC流式上传时报upstream sent frame错误
问题根因
你遇到的报错核心是Nginx在客户端流式gRPC请求处理过程中,提前关闭了HTTP/2连接流,等到后端gRPC服务处理完上传逻辑返回响应时,对应的流已经被释放,所以触发HTTP/2 INTERNAL_ERROR报错,Nginx日志也对应提示upstream sent frame for closed stream。最常见的触发原因是默认的gRPC读写超时阈值小于大文件上传的实际耗时,或者Nginx版本过低存在gRPC流式处理的兼容性bug。
解决方案
- 首先确认Nginx版本≥1.20.0稳定版,1.19.x及更早版本对gRPC客户端流、双向流的支持存在已知缺陷,会偶发流提前关闭的问题,版本过低先升级到官方稳定版。
- 补充gRPC专属超时配置,Nginx默认的
grpc_read_timeout、grpc_send_timeout仅为60秒,大文件上传耗时超过该阈值就会被Nginx主动切断流,根据业务最大上传耗时调整参数。 - 禁用gRPC缓冲,避免Nginx缓存流式数据导致请求时序异常。
- 确认上游gRPC服务的通信协议匹配,
grpcs://代表Nginx和上游服务之间用TLS加密通信,如果上游服务没有配置TLS证书,需要修改为grpc://走明文HTTP/2通信。 - 调大HTTP/2空闲连接超时阈值,避免Nginx主动回收还在处理上传请求的空闲连接。
修改后的完整配置示例
server { listen 13*.**.**.** ssl http2; server_name mydomain.com 13*.**.**.**; access_log /var/log/nginx/myservice.log; error_log /var/log/nginx/myservice_error.log; ssl_certificate /etc/ssl/certs/myssl.crt; ssl_certificate_key /etc/ssl/private/myssl.key; ssl_prefer_server_ciphers on; # gRPC专属配置 grpc_read_timeout 1h; # 按需调整,比如最大允许上传耗时1小时 grpc_send_timeout 1h; grpc_buffer_size 16M; # 匹配gRPC服务端配置的最大消息大小 grpc_buffering off; # HTTP/2连接配置 http2_idle_timeout 1h; location / { # 上游服务未开TLS则改为grpc://127.0.0.1 grpc_pass grpcs://127.0.0.1; } }
生效验证
- 执行
nginx -t检查配置语法是否合法 - 执行
nginx -s reload平滑重载Nginx配置 - 重新测试大文件上传流程,确认等待响应阶段不再抛出异常
内容的提问来源于stack exchange,提问作者Amir H. Bagheri
相关产品推荐
相关产品推荐

