Nginx-proxy_buffer_size and fastcgi_buffer


118 0

上个月无意中看到里查看nginx日志出现upstream sent too big header while reading response header from upstream错误。 


1、反向代理端,可以放到server中: 

        client_header_buffer_size 128k; 

        large_client_header_buffers 4 128k; 

        proxy_buffer_size 64k; 

        proxy_buffers 8 64k; 

        fastcgi_buffer_size 128k; 

        fastcgi_buffers 4 128k; 


  主要是proxy的那组参数,网上的解决这三方面都有。 


2、web-server: 

最主要的是fastcgi那组。 


3、一般用16k足够。


sudo gedit /var/log/nginx/error.log


查看错误日志

upstream sent too big header while reading response header from upstream


你去搜这个错误,网上的解释都差不多,无外乎是cookie携带的header太多了,让你设置:


fastcgi_buffer_size 128k;

fastcgi_buffers 8 128k;


逐步尝试。其中fastcgi_buffers 8 128k 这句,fastcgi_buffers 32 32k 这样更好,内存是整块分配和释放的,减少单位k数能尽可能利用。


另外,如果你用nginx做负载均衡的话,改了上述参数是没用的,要在转发的配置上,比如以下设置:


location @to_other {


                proxy_buffer_size  128k;


                proxy_buffers   32 32k;


                proxy_busy_buffers_size 128k;


                add_header X-Static transfer;


                proxy_redirect off;


                proxy_set_header Host $host;


                proxy_set_header X-Real-IP  $remote_addr;


                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


                proxy_pass http://backend;    #请求转发


        }


加粗的三行才会起作用。


fastcgi_* 可以理解成nginx接受client请求时的响应使用的。proxy是nginx作为client转发时使用的,如果header过大,超出了默认的1k,就会引发上述的upstream sent too big header。


可以参考:


http://wiki.nginx.org/NginxHttpProxyModule


http://blog.sina.com.cn/s/blog_5dc960cd0100i4mt.html


其它搜索结果可以无视,都是大同小异的。


location ~ \.php$ {


       fastcgi_buffer_size 128k;


       fastcgi_buffers 32 32k;


       include /etc/nginx/fastcgi_params;


       fastcgi_pass   127.0.0.1:9000;


       fastcgi_index index.php;


       fastcgi_param SCRIPT_FILENAME /host/web/$fastcgi_script_name;


    }


以下引自他人的博客


一直没有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数量的

————————————————

版权声明:本文为CSDN博主「IT黑旋风」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/u010391029/java/article/details/50850210


看过的人 (0)
最新回复 (0)
    • 虾壳社区_游戏源码资源社区_游戏源码资源网_私服搭建教程_手游私服源码
      2
          
返回