背景
1.大量客户端通过nginx代理到httpd下载文件
2.nginx warn an upstream is buffered to a temporary file xxx
3.OS IOWait打满
尝试方案一(配置fastcgi)
#指定读取FastCGI应答第一部分需要用多大的缓冲区,这里可以设置为fastcgi_buffers指令指定的缓冲区大小,
#下面的指令指定它将使用1个16k的缓冲区去读取应答的第一部分,即应答头,其实这个应答头一般情况下都很小(不会超过1k),
#但是你如果在fastcgi_buffers指令中指定了缓冲区的大小,那么它也会分配一个fastcgi_buffers指定的缓冲区大小去缓存
fastcgi_buffer_size 16k;
#指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答,如下所示,如果一个php脚本所产生的页面大小为256k,则会为其分配16个16k的缓冲区来缓存,
#如果大于256k,增大于256k的部分会缓存到fastcgi_temp指定的路径中, 当然这对服务器负载来说是不明智的方案,
#因为内存中处理数据速度要快于硬盘,通常这个值 的设置应该选择一个你的站点中的php脚本所产生的页面大小的中间值,
#比如你的站点大部分脚本所产生的页面大小为 256k就可以把这个值设置为16 16k,或者4 64k 或者64 4k,
#但很显然,后两种并不是好的设置方法,因为如果产生的页面只有32k,如果用4 64k它会分配1个64k的缓冲区去缓存,
#而如果使用64 4k它会分配8个4k的缓冲区去缓存,而如果使用16 16k则它会分配2个16k去缓存页面,这样看起来似乎更加合理。
fastcgi_buffers 16 16k;
#默认值是fastcgi_buffers的两倍。
fastcgi_busy_buffers_size 16k;
#在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍。
fastcgi_temp_file_write_size 16k;
方案一效果:无
原因:fastcgi_* 可以理解成nginx接受client请求时的响应使用的。proxy是nginx作为client转发时使用的
尝试方案二(配置缓冲区)
如果没有缓冲,数据从代理的服务器发送并立即开始被发送到客户。如果假定客户端很快,缓冲可以关闭而尽快使数据到客户端,有了缓冲,Nginx代理将暂时存储后端的响应,然后按需供给数据给客户端。如果客户端是缓慢的,允许Nginx服务器关闭到后端的连接。然后,它可以处理数据分配到客户端,以任何可能的速度。
#proxy_max_temp_file_size指定当响应内容大于proxy_buffers指定的缓冲区时, 写入硬盘的临时文件的大小.
#如果超过了这个值, Nginx将与Proxy服务器同步的传递内容, 而不再缓冲到硬盘。某些请求的响应过大,则超过buffers的部分将被缓冲到
#硬盘(缓冲目录由_temp_path指令指定), 当然这将会使读取响应的速度减慢, 影响用户体验. 可以使用proxy_max_temp_file_size指令关闭磁盘缓冲.
proxy_max_temp_file_size 0;
成功,但是要考虑,如果按上面的设置,内存会是一个瓶颈吧?建议还是设置设置固定的内存大小(仍然会有瓶颈,但是相对小些)
#proxy_buffering开启的情况下,nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端(边收边传,不是全部接收完再传给客户端)。
#控制是否打开后端响应内容的缓冲区,如果这个设置为off,那么proxy_buffers和proxy_busy_buffers_size这两个指令将会失效。
#但是无论proxy_buffering是否开启,对proxy_buffer_size都是生效的。
#proxy_buffering on;
#响应头的缓冲区,没有必要也跟着设置太大。最好单独设置,一般设置个4k就够了。
proxy_buffer_size 4k;
#proxy_buffers的缓冲区大小一般会设置的比较大,以应付大网页。当中单个缓冲区的大小是由系统的内存页面大小决定的,Linux系统中一般为4k。
#proxy_buffers由缓冲区数量和缓冲区大小组成的。总的大小为number*size。
proxy_buffers 8 1M; // 高速传输
proxy_buffer 4 32k; // 一般情况
#proxy_busy_buffers_size不是独立的空间,它是proxy_buffers和proxy_buffer_size的一部分。
#nginx会在没有完全读完后端响应的时候就开始向客户端传送数据,
#所以它会划出一部分缓冲区来专门向客户端传送数据(这部分的大小是由proxy_busy_buffers_size来控制的,
#建议为proxy_buffers中单个缓冲区大小的2倍),然后它继续从后端取数据,缓冲区满了之后就写到磁盘的临时文件中。
proxy_busy_buffers_size 2M; // 高速传输
proxy_busy_buffers_size 64k; // 一般情况
(proxy_buffers>proxy_busy_buffers_size>proxy_buffer_size)
参考链接
https://blog.sometimesnaive.org/article/44
https://segmentfault.com/a/1190000015921504
nginx缓存缓冲配置