Nginx Proxy buffer 工作原理

本文深入解析Nginx中proxy_buffer_size、proxy_buffering、proxy_buffers及proxy_busy_buffers_size等参数的工作原理与配置方法,帮助理解响应内容如何在内存与磁盘间高效缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直没有proxy buffer参数设置的权威解读,大多数都是自己的猜测,这次花了一天多时间仔细读了nginx的相关源码,也泡了泡Nginx的论坛,总算彻底搞明白了这个问题,写成此文,可以说是网上能找到的最权威的中文解读了。

相关参数
proxy_buffer_size

语法: proxy_buffer_size the_size

默认值: proxy_buffer_size 4k/8k

上下文: http, server, location

该指令设置缓冲区大小,从代理后端服务器取得的第一部分的响应内容,会放到这里.

小的响应header通常位于这部分响应内容里边.

默认来说,该缓冲区大小等于指令 proxy_buffers所设置的;但是,你可以把它设置得更小.

proxy_buffering

语法: proxy_buffering on|off

默认值: proxy_buffering on

上下文: http, server, location

该指令开启从后端被代理服务器的响应内容缓冲.

如果缓冲区开启,nginx假定被代理的后端服务器会以最快速度响应,并把内容保存在由指令proxy_buffer_size 和 proxy_buffers指定的缓冲区里边.

如果响应内容无法放在内存里边,那么部分内容会被写到磁盘上。

如果缓冲区被关闭了,那么响应内容会按照获取内容的多少立刻同步传送到客户端。

nginx不尝试计算被代理服务器整个响应内容的大小,nginx能从服务器接受的最大数据,是由指令proxy_buffer_size指定的.

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

proxy_buffers

语法: proxy_buffers the_number is_size;

默认值: proxy_buffers 8 4k/8k;

上下文: http, server, location

该指令设置缓冲区的大小和数量,从被代理的后端服务器取得的响应内容,会放置到这里. 默认情况下,一个缓冲区的大小等于内存页面大小,可能是4K也可能是8K,这取决于平台。

proxy_busy_buffers_size

语法: proxy_busy_buffers_size size;

默认值: proxy_busy_buffers_size proxy_buffer_size * 2;

上下文: http, server, location, if

TODO: Description.

buffer工作原理

首先第一个概念是所有的这些proxy buffer参数是作用到每一个请求的。每一个请求会安按照参数的配置获得自己的buffer。proxy buffer不是global而是per request的。

proxy_buffering 是为了开启response buffering of the proxied server,开启后proxy_buffers和proxy_busy_buffers_size参数才会起作用。

无论proxy_buffering是否开启,proxy_buffer_size(main buffer)都是工作的,proxy_buffer_size所设置的buffer_size的作用是用来存储upstream端response的header。

在proxy_buffering 开启的情况下,Nginx将会尽可能的读取所有的upstream端传输的数据到buffer,直到proxy_buffers设置的所有buffer们被写满或者数据被读取完(EOF)。此时nginx开始向客户端传输数据,会同时传输这一整串buffer们。同时如果response的内容很大的话,Nginx会接收并把他们写入到temp_file里去。大小由proxy_max_temp_file_size控制。如果busy的buffer传输完了会从temp_file里面接着读数据,直到传输完毕。

一旦proxy_buffers设置的buffer被写入,直到buffer里面的数据被完整的传输完(传输到客户端),这个buffer将会一直处在busy状态,我们不能对这个buffer进行任何别的操作。所有处在busy状态的buffer size加起来不能超过proxy_busy_buffers_size,所以proxy_busy_buffers_size是用来控制同时传输到客户端的buffer数量的。

http://www.ioutlier.com/nginx-proxy-buffer-works/

### 代理服务器缓冲区配置及相关问题 #### 缓冲区的作用 在代理服务器中,缓冲区用于临时存储来自客户端请求的数据以及从目标服务器接收到的响应数据。这种机制有助于提高性能并管理网络流量。当代理服务器接收到来自客户端的大文件上传或下载请求时,可以先将其存入内存中的缓冲区再逐步转发给实际的目标服务器;反之亦然。 #### 配置参数 对于不同的代理实现方式而言,具体的缓冲区设置会有所不同: - **Nginx**: 可通过`proxy_buffer_size`, `proxy_buffers` 和 `proxy_busy_buffers_size` 来调整HTTP代理模块下的缓存行为[^1]。 ```nginx http { ... proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; ... } ``` - **Apache HTTP Server**: 使用`ProxyReceiveBufferSize`指令来指定每个连接的最大接受字节数量,默认情况下该值为操作系统定义的标准大小[^2]。 ```apache <IfModule mod_proxy.c> ProxyReceiveBufferSize 1048576 </IfModule> ``` - **HAProxy**: HAProxy允许用户设定最大读取和写入操作期间使用的内存量(`tune.bufsize`)以及其他相关选项如超时时间等[^3]。 ```haproxy global tune.bufsize 16384 defaults timeout connect 5s timeout client 50s timeout server 50s ``` #### 常见问题及其解决方案 ##### 大文件传输导致的问题 如果应用程序涉及大量数据交换,则可能会遇到由于默认缓冲区过小而引起的错误消息,比如“502 Bad Gateway”。此时应该适当增加上述提到的相关参数数值以适应更大的负载需求。 ##### 性能优化建议 为了获得更好的效率表现,在不影响稳定性的前提下尽可能减少不必要的I/O等待事件发生次数是非常重要的。可以通过增大单次可处理的数据包长度或者启用压缩算法等方式达到目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值