Nginx正在从上游读取响应头时,上游发送的响应头过大。

13 浏览
0 Comments

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()没有给到我所有的响应头信息,它只给了我expirescache-controlpragma标头信息。

更改proxy_buffer_size会造成性能问题吗?

(nginx版本: nginx/1.6.0,php 5.4.42,xcache 3.2)

admin 更改状态以发布 2023年5月21日
0
0 Comments

你可以很容易地在SO上找到答案,但真正有影响的是单一的配置选项:

http {
  fastcgi_buffer_size 32k;
}

尽管这个建议可能不是你想要的。让我们通过细节看看为什么这有助于解决问题:

fastcgi_buffer

语法:fastcgi_buffers number size;

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

上下文:http,server,location

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

fastcgi_buffer_size

语法: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;
}

0