什么是代理缓冲

Nginx作为一个常用的反向代理,提供了代理缓冲的功能。它允许nginx将server端的响应读取下来缓存在本地内存或磁盘中,再已合适的速度发送给客户端。

为什么要有代理缓冲

在互联网中,nginx作为反向代理层,往往和server是在同区机房的。这意外这nginx和server之间的网络质量很好,nginx可以用很快的速度从server端读取响应。

但是客户端往往是用户网络,到nginx的机房网络质量不可控,肯定是要远远低于nginx到后端server的网速。
这就会带来一个问题:因为客户端到nginx的网速过慢,导致nginx只能以一个较慢的速度将响应传给客户端;进而导致后端server也只能以同样较慢的速度传递响应给nginx,造成一次请求连接耗时过长。
在高并发的情况下,后端server可能会出现大量的连接积压,最终拖垮server端。

代理缓冲的优缺点

代理缓冲的优点
(1)开启代理缓冲后,nginx可以用较快的速度尽可能将响应体读取并缓冲到本地内存或磁盘中,然后同时根据客户端的网络质量以合适的网速将响应传递给客户端。
(2)这样既解决了server端连接过多的问题,也保证了能持续稳定的像客户端传递响应。

代理缓冲的缺点
(1)开启代理缓冲会消耗nginx服务器的内存,如果请求过多,可能会导致nginx内存消耗过大;所以缓冲区的大小设置需要根据实际的服务器配置和请求量进行评估。
(2)在响应过大的情况下,设置的缓冲区无法存下整个响应体,nginx会将剩余的内容写到磁盘临时文件中。在请求量较大的情况下,可能会导致nginx服务器磁盘io过高。而往往临时文件都存放在/tmp下,而/tmp目录一般挂载在系统盘上,系统盘io过高会进一步导致系统负载上涨。
(3)在客户端网络质量很好的情况下,比如客户端到nginx也是同机房内,这时关闭代理缓冲直接将响应实时转发给客户端效率更高。


代理缓冲的配置参数

nginx对于控制代理缓冲区,有一些常用的配置参数。这些参数都是可以作用于http块、server块或者location块中。

1. proxy_buffering

Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location

复制代码该参数用户控制开启或关闭代理缓冲区。

当开启代理缓冲区时,nginx会尽快的从server端读取响应并缓存在内存分配的缓冲区中。代理缓冲区的大小由proxy_buffer_size和proxy_buffers参数指定。

当响应大小超出内存缓冲区时,一部分响应体可以保存在磁盘临时文件中。磁盘临时文件的大小由proxy_max_temp_file_size和proxy_temp_file_write_size参数指定。

2. proxy_buffer_size

Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location

复制代码该参数用于设置从server端读取初始部分响应(the first part of the response)所使用的缓存大小。这部分通常包含了一个小的response header。

通常,该缓冲区大小设置为一个内存页的大小,具体是4k或8k,取决于服务器平台。也可以把它设置的更小,但是没必要设置过大了,因为只是用于缓冲初始部分响应。

值得注意的是,proxy_buffer_size参数并不受proxy_buffering开启或关闭的影响。它始终都是生效的。

3. proxy_buffers

Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location

复制代码该参数用于设置从server端读取响应所使用的缓冲区个数和大小。通常默认情况下,单个缓冲区大小设置为一个内存页的大小,如4k或8k。

值得注意的是,这里设置的缓冲区大小是针对每个请求连接而言的。也就是说对于每一个连接,都会分配 ”number*size“大小的内存缓冲区。

另外需要注意,要根据服务器配置和请求量评估缓冲区配置大小;避免出现nginx将内存耗尽的情况。

4. proxy_busy_buffers_size

Syntax: proxy_busy_buffers_size size;
Default: proxy_busy_buffers_size 8k|16k;
Context: http, server, location

复制代码该参数用于设置当还未从server端读取到完整响应时,允许开始给客户端发送响应的缓冲区大小。

在指定大小的缓冲区进入busy状态后将无法再写入,而剩余的缓冲区可以同时继续从server端读取响应,或者将响应写入磁盘临时文件。

通常该参数值设置为proxy_buffer_size和proxy_buffers中单个buffer之和,也就是单个内存页的2倍。

5. proxy_max_temp_file_size

Syntax: proxy_max_temp_file_size size;
Default: proxy_max_temp_file_size 1024m;
Context: http, server, location

复制代码该参数用于设置磁盘临时文件的最大size。

当server端返回的整个响应超出proxy_buffering和proxy_buffers设置的内存缓冲区大小时,剩余的响应体可以保存在一个磁盘临时文件中。proxy_max_temp_file_size指定了该临时文件的最大大小。

而一次能写入磁盘临时文件的数据大小由proxy_temp_file_write_size参数指定。

注意,proxy_max_temp_file_size参数设置为0可以禁止将响应保存到磁盘临时文件中。

6. proxy_temp_file_write_size

Syntax: proxy_temp_file_write_size size;
Default: proxy_temp_file_write_size 8k|16k;
Context: http, server, location

复制代码该参数用于设置每次写入磁盘临时文件的大小。

通常该参数值设置为proxy_buffer_size和proxy_buffers中单个buffer之和,也就是单个内存页的2倍。
代理缓冲配置样例

# 开启proxy_buffering
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 4 4k;
proxy_busy_buffers_size 8k;
proxy_max_temp_file_size 0;