南琴浪博客

Nginx 启用 proxy_buffer 缓冲

01/01/2018

顾名思义,proxy_buffer 是用于 proxy 模式的缓冲功能。本文介绍其基本用法。

buffer 是什么

buffer,即缓冲区,它在 Nginx 上发挥的作用就是启用一个缓冲区,先在这个缓冲区内进行存储,再把数据发送出去。和在线观看视频有点类似,先把视频文件缓冲一部分到本地再开始播放。

若没有 buffer,数据将会直接从 Nginx 传输到客户端。假设如果客户端的加载速度足够快,你可以直接把 buffer 关掉,让数据尽可能快地到达客户端。

而使用 buffer,Nginx 将会临时存储后端 response 到缓冲区,然后慢慢把数据发送到客户端。启用 buffer 的好处在于可以把数据一次性地发送给目标,相较于即时传输可以节约出这部分带宽。

顺带一提,Nginx 全局配置中的 tcp_nopush 的作用就是数据包会累计到一定大小之后才会发送。而 tcp_nodelay 是尽快发送数据,所以若你启用了 buffer,建议关闭 tcp_nodelay。

proxy_buffer 的配置

proxy_buffer 是用于 proxy 模式(一般也可称为反向代理)的 buffer 配置。Nginx 有另外一种适用于 server 模式的 buffer 配置,这里本帖不做介绍。

proxy_buffer 包括了以下配置项:

需注意,以下指定的数值都是针对每一个 http request 的上限,而不是对于整个 buffer 区指定的上限。

proxy_buffering

proxy_buffering  on;

proxy_buffering 开启的时候,proxy_buffers 和 proxy_busy_buffers_size 才会起作用。

proxy_buffers

proxy_buffers  4 8k;

指定一个 request 的 buffer 的数量和大小。

proxy_buffer_size

proxy_buffer_size  4k;

指定后端 response 的 buffer 的大小。它是来自后端 response 的一部分,它包含 Headers,从 response 分离出来。它仅用于限定 headers 的 buffer 区,所以它的值比 proxy_buffers 更低。

proxy_buffer_size 有一点特殊在于,无论 proxy_buffering 是否开启,proxy_buffer_size 都会起作用。

proxy_busy_buffers_size

proxy_busy_buffers_size  12k;

忙时 buffer 的最大值。一个客户端一次只能从一个 buffer 中读取数据的同时,剩下的 buffer 会被放到队列中,等待发送到客户端,这个 directive 指定在这个状态下的 buffer 的大小。