Nginx正在从上游读取响应头时,上游发送的响应头过大。
Nginx正在从上游读取响应头时,上游发送的响应头过大。
我遇到了这样的错误:
[error] 27544#0: *47335682 upstream sent too big header while reading response header from upstream, client: 88.88.88.88, server: example..com, request: "POST /tool/ HTTP/1.1", upstream: "http://88.88.88.88:7080/tool/", host: "example.com"
关于这个问题,可以像这样从Nginx配置文件中增加缓冲区大小:upstream sent too big header while reading response header from upstream
http { proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; } location fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;
(作为将来的参考,快速cgi的缓冲区大小和缓冲区默认大小为4k或8k,具体取决于平台)
用户浏览器中出现的文本为:Nginx 502 Bad Gateway
我计划暂时增加缓冲区大小。然后,我可以记录当缓冲区过大时。是否可以找出对于上游而言过大的标头?apache_response_headers()
和headers_list()
没有给到我所有的响应头信息,它只给了我expires
、cache-control
和pragma
标头信息。
更改proxy_buffer_size
会造成性能问题吗?
(nginx版本: nginx/1.6.0,php 5.4.42,xcache 3.2)
你可以很容易地在SO上找到答案,但真正有影响的是单一的配置选项:
http { fastcgi_buffer_size 32k; }
尽管这个建议可能不是你想要的。让我们通过细节看看为什么这有助于解决问题:
语法:fastcgi_buffers number size;
默认值:fastcgi_buffers 8 4k|8k;
上下文:http,server,location
设置用于读取来自FastCGI服务器的响应的缓冲区的数量和大小,对于单个连接。默认情况下,缓冲区大小等于一个内存页面。这取决于平台,是4K还是8K。
语法:fastcgi_buffer_size size;
默认值:fastcgi_buffer_size 4k|8k;
上下文:http,server,location
设置用于读取来自FastCGI服务器接收到的响应的第一部分的缓冲区的大小。该部分通常包含一个小的响应头。默认情况下,缓冲区大小等于一个内存页面。这取决于平台,是4K还是8K。但是,它可以被缩小。
所以只有fastcgi_buffer_size有影响,因为响应头不适合4KB缓冲区。大多数情况下,这是由于Cookie大小大。因此,强烈建议保持设置不变,而降低Cookie大小,仅存储最少量的数据,例如user_id,session_id,所以Cookie存储的一般想法是非敏感ID集。有些浏览器不会很好地处理大型Cookie。
所以解决方案是:
1. Reduce cookie size 2. Get back to original settings http { fastcgi_buffers 8 4k; fastcgi_buffer_size 4k; }
如果减少Cookie大小遇到困难,请关闭某些位置的缓冲:
location /request { fastcgi_buffering off; }