Nginx反向代理gRPC单向流时因上游消息量触发连接关闭的配置调整咨询
Nginx反向代理gRPC单向流时因上游消息量触发连接关闭的配置调整咨询
看起来你遇到的这个问题确实有点棘手——明明把各种读写超时都拉到6小时了,结果还是因为上游的消息总量触发了连接关闭,还有130KB这个奇怪的阈值,结合你说的“客户端一分钟没读就断”的现象,我大概能猜到问题出在哪几个配置上。
你观察到的130KB阈值其实不是巧合,它刚好和Nginx默认的gRPC缓冲区总容量(8个16KB缓冲区,加起来128KB)非常接近。Nginx处理gRPC流的时候,会把上游发来的每条消息先缓冲在内存里,再转发给客户端。如果客户端突然停止读取数据,这些缓冲区很快就会被填满,这时候Nginx就会暂停从上游读取新的消息。当Nginx和上游的连接进入“没数据传输”的空闲状态后,默认的60秒上游长连接空闲超时就会触发,Nginx就主动把连接关了——这就是你看到“一分钟后断连”的原因。
你需要调整以下几个Nginx指令来解决这个问题:
1. 扩大gRPC缓冲区容量
在你的/example.Greeter location块里添加缓冲区相关配置,让Nginx能缓冲更多上游消息,避免因为缓冲区满而暂停读上游数据:
location /example.Greeter { grpc_read_timeout 6h; grpc_send_timeout 6h; client_body_timeout 6h; client_header_timeout 6h; # 把gRPC缓冲区调整为64个16KB块,总容量1024KB(可根据实际需求调整) grpc_buffers 64 16k; # 单个gRPC消息的初始缓冲区大小 grpc_buffer_size 64k; grpc_pass grpcs://greeting_server; }
2. 配置上游长连接保持参数
在你的upstream块里添加长连接相关配置,直接延长Nginx和上游服务端之间连接的空闲超时时间:
upstream greeting_server { server 127.0.0.1:50051; # 保持32个长连接(可根据你的并发请求量调整) keepalive 32; # 长连接空闲超时设为6小时,和你其他超时配置保持一致 keepalive_timeout 6h; # 每个长连接可处理的请求数,流式请求建议设大一点 keepalive_requests 1000; }
3. 检查全局/Server级别的超时配置
有时候全局的短超时参数会“钻空子”,你可以在server块里补充以下配置,确保没有遗漏的短超时:
server { //... client_header_timeout 6h; # 补充全局级别的发送/读取超时,覆盖默认的60秒 send_timeout 6h; read_timeout 6h; location /example.Greeter { // 已有的配置... } //... }
这些配置调整后,应该就能避免因为客户端暂停读取、上游消息量触发的连接关闭问题了。
备注:内容来源于stack exchange,提问作者WeiAnHsieh
相关产品推荐
相关产品推荐

