当前位置: 代码迷 >> 综合 >> nginx upstream sent too large http2 frame问题排查
  详细解决方案

nginx upstream sent too large http2 frame问题排查

热度:20   发布时间:2023-12-12 02:41:23.0

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

  相关解决方案