【问题标题】:Nginx upstream sent too big header while reading response header from upstreamNginx 上游在从上游读取响应头时发送了太大的头
【发布时间】:2015-10-26 19:20:48
【问题描述】:

我收到这样的错误:

[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 文件中增加缓冲区大小: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;

(供将来参考,fastcgi_buffer_size 和 fastcgi_buffers 的默认大小为 4k 或 8k,取决于平台)

此文本出现在用户的浏览器中:Nginx 502 Bad Gateway

我打算暂时增加缓冲区大小。然后我可以在缓冲区太大时记录。是否可以找出对于上游来说太大的标头? apache_response_headers() 和 headers_list() 没有给我所有的响应头。它只给了我过期、缓存控制和杂注标头。

更改 proxy_buffer_size 会导致性能问题吗?

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

【问题讨论】:

  • 查看stackoverflow.com/questions/13894386/…它应该会回答你的问题。
  • 你的问题到底是什么意思?您应该如何使用 nginx 检查标头?它是一个网络服务器,而不是编辑器或流量嗅探工具。如果你想检查标题,我建议使用 tcpdump。
  • 临时增加缓冲区大小并记录大标题也是一种选择。但是 php headers_list 没有给出这个数据。
  • Nginx 支持自定义 access_log 例如:*log_format combine '$remote_addr - $remote_user [$time_local] - $sent_http_set_cookie' *
  • 我需要在我们的 php 代码中获取此标头数据。

标签: cakephp nginx http-headers


【解决方案1】:

您可以轻松找到关于 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 大小;

默认:fastcgi_buffer_size 4k|8k;

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

设置用于读取第一部分的缓冲区大小 从 FastCGI 服务器收到的响应。这部分通常包含 一个小的响应头。默认情况下,缓冲区大小等于 1 内存页。这是 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;
}

【讨论】:

  • 在临时增加缓冲区大小并记录所有具有大标头大小的请求的情况下,如何在 php 中记录标头?我尝试了 apache_response_headers()、headers_list() 但他们只给出了这些数据:Expires、Cache-Control、Pragma。而且这个数据很小,不适合旧的缓冲区大小。
  • 我在 ownCloud 上遇到了这个问题。如何减小 cookie 大小?
  • @danger89:这将在所服务的应用程序中以及它使用的 cookie 有多大。
猜你喜欢
  • 2020-01-15
  • 2018-12-14
  • 2017-04-09
  • 2019-12-21
  • 2021-02-04
  • 2014-11-03
  • 2019-12-09
  • 1970-01-01
相关资源
最近更新 更多