xiaoxiao
发布于 2023-07-03 / 263 阅读 / 0 评论 / 0 点赞

[nginx] 由proxy_buffering导致的数据无法及时返回

目前有一组k8s集群需要暴露到外部访问,需要经过入口服务器的代理,因为只有入口服务器才有公网ip。

代理分为两层,第一层由openresty代理至apisix,第二层由apisix到api-server。
nginx通过apisix代理k8s.svg

现象

配置代理后发现kubectl通过openresty获取实时日志一直没有返回数据,但是在apisix下可以,本来怀疑是实时日志由websocket协议提供支持,通过抓包后发现并不是。

随即怀疑是代理有缓存,需要缓存至一定大小才能返回数据,搜索nginx代理缓存后得到答案,配置后可以正常拉取。

proxy_buffering

语法: proxy_buffering on|off
默认值: proxy_buffering on
上下文: http,server,location
# 指令proxy_buffering决定 NGINX 是异步(默认启用)还是同步(禁用)转发响应。

作用:启用或禁用来自代理服务器的响应缓冲

当启用缓冲时,nginx会尽快从代理服务器接收响应,并将其保存到由proxy_buffer_size和proxy_buffers指令设置的缓冲区中。如果整个响应无法装入内存,则可以将其中的一部分保存到磁盘上的临时文件中。写入临时文件是由proxy_max_temp_file_size和proxy_temp_file_write_size指令控制的。

当缓冲区被禁用时,响应被同步地立即传递给客户端。Nginx不会尝试从代理服务器读取整个响应。nginx一次可以从服务器接收的最大数据大小是由proxy_buffer_size指令设置的。

缓冲也可以通过在“X-Accel-Buffering”响应头字段中传递“yes”或“no”来启用或禁用。此功能可以使用proxy_ignore_headers指令禁用。

对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,不然异步响应将被缓存导致Comet无法工作。

扩展阅读

nginx官方文档:http://nginx.org/en/docs/http/ngx_http_proxy_module.html


评论