繁体   English   中英

Nginx上游在从上游读取响应头时发送了太大的头

[英]Nginx upstream sent too big header while reading response header from upstream

我得到这样的错误:

[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 conf文件增加缓冲区大小,如下所示: 上游从上游读取响应头时发送过大的头

http {
  proxy_buffer_size   128k;
  proxy_buffers   4 256k;
  proxy_busy_buffers_size   256k;
}

location
      fastcgi_buffers 16 16k; 
      fastcgi_buffer_size 32k;

(为了将来参考,fastcgi_buffer_size和fastcgi_buffers的默认大小是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_buffer

语法:fastcgi_buffers数字大小;

默认值:fastcgi_buffers 8 4k | 8k;

上下文:http,服务器,位置

设置用于从FastCGI服务器读取响应的缓冲区的数量和大小,用于单个连接。 默认情况下,缓冲区大小等于一个内存页面。 这是4K或8K,具体取决于平台。

fastcgi_buffer_size

语法:fastcgi_buffer_size size;

默认值:fastcgi_buffer_size 4k | 8k;

上下文:http,服务器,位置

设置用于读取从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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM