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