目前有一组k8s集群需要暴露到外部访问,需要经过入口服务器的代理,因为只有入口服务器才有公网ip。
代理分为两层,第一层由openresty代理至apisix,第二层由apisix到api-server。
现象
配置代理后发现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