nginx upstream sent too large http2 frame问题排查

error如下:

 

upstream sent too large http2 frame: 4740180 while reading response header from upstream

首先看怀疑是nginx接收源站buffer太小导致,于是修改buffer大小
http2_max_field_size  1m;
http2_max_header_size 1m;
http2_recv_buffer_size 1m;
http2_chunk_size  m;

修改之后还是报错没有解决问题。

抓包看了一下请求响应数据,发现所有请求响应都是http协议。

在使用nginx做反向代理到grpc server集群时,使用的应该是http2协议。

当在上游服务器同一端口上运行既有gRPC和HTTP/1的时,RPC连接可能会被HTTP/1请求所破坏。

4740180 is ascii-encoded HTT,所以当从上游连接套接字读取时,得到的是了HTTP/1应答。

问题的原因是,nginx使用grpc_pass回源时grpc得到的是http响应。

在普通HTTP和gRPC上使用相同的ip:port是否可以工作

必要时需要配置 grpc_set_header以及proxy缓存大小

proxy_buffering/proxy_buffer_size/proxy_buffers等

回源至grpc服务时,使用grpc_pass,源站必须是grpc服务。

回源至http服务时,使用proxy_pass,源站必须是http服务。

如果使用grpc_pass回源至http服务就会出现问题。

参考:[bug/question]: Is multiplexing HTTP/1 and gRPC supported? · Issue #4095 · kubernetes/ingress-nginx · GitHub

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值