Nginx问题修复与优化: upstream sent too big header while reading response header from upstream

  |   0 评论   |   1,053 浏览

服务器前端浏览器报502的时候, 查询代理服务器Nginx的日志中有: upstream sent too big header while reading response header from upstream, client 很明显这个是后端服务器返回的header过大导致.

根据之前的文章: Nginx Buffer 简记 - Nginx Proxy 相关Buffer性质与配置关系 - proxy_buffer_size - proxy_buffers - proxy_busy_buffers_size 我们知道, 这个header相关的配置主要是proxy_buffer_size的大小配置有问题.

WeChatWorkScreenshot2ec495a7d4934fff95b93ad0ade7be98.png

proxy_buffer_size

一句话总结: 用于缓冲 upstream_server 返回的第一部分, 即: Header

Syntax:proxy_buffer_size size;
Default:proxy_buffer_size 4k\|8k;
Context:http, server, location

Sets the <i>size</i> of the buffer used for reading the first part of the response received from the proxied server. This part usually contains a small response header. By default, the buffer size is equal to one memory page. This is either 4K or 8K, depending on a platform. It can be made smaller, however.

翻译:
设置缓冲区的大小用来读取从代理服务器收到的响应的 第一部分 。这部分通常包含一个小的响应头( Header )。默认情况下,此缓冲区大小等于1个page。这是4 k或8 k,取决于平台。然而,它可以做得更小。

我的系统是CentOS64位系统.实际page大小为 4k. 这个可以参考: upagesiz

getconf PAGE_SIZE
4096

因此我的页大小实际为4k.那这个存储header的缓冲区大小为: 4k 即4096字节. 如果后端服务器返回的header过大的时候就会溢出. nginx在header过大时,不会缓存到文件(body会缓存到文件),而是直接报了502.

修改方案也很简单. 直接调整这个大小值为合理值就可以了. 比如直接添加:

proxy_buffer_size    32k;

但是这样是不可以的. 会得到如下的错误:

proxy_busy_buffers_size" must be less than the size of all "proxy_buffers" minus one buffer

也就是说busy_buffers_size太大了. 这个默认值是怎么来的呢. 它需要取两个缓存区块的最大值. 也就是当

  1. proxy_buffer_size 为32k.
  2. proxy_buffers 设置时,默认为: 8 4k

那 busy_buffers_size 的值是32k. 它大于了 (8-1)*4 = 28k. 我们先把 busy_buffers_size 显式设置为 32k,看看.

proxy_buffer_size    32k;
busy_buffers_size    32k;

得到的错误是一样的:

/usr/sbin/nginx -t
nginx: [emerg] "proxy_busy_buffers_size" must be less than the size of all "proxy_buffers" minus one buffer in /etc/nginx/nginx.conf:42
nginx: configuration file /etc/nginx/nginx.conf test failed

此时我们把 proxy_busy_buffers_size 设置为 proxy_buffers 的默认值的一半试:

proxy_buffer_size    32k;
busy_buffers_size    16k;

此时我们得到:

/usr/sbin/nginx -t
nginx: [emerg] "proxy_busy_buffers_size" must be equal to or greater than the maximum of the value of "proxy_buffer_size" and one of the "proxy_buffers" in /etc/nginx/nginx.conf:42
nginx: configuration file /etc/nginx/nginx.conf test failed

即proxy_busy_buffers_size 必须要大于等于 proxy_buffer_size 和 proxy_buffers 中的一个缓冲区的大小. 因此我们可以设置一个如下的配置:

proxy_buffers 8 8k;  # 把body相关的缓冲大小扩大一倍
    proxy_busy_buffers_size   32k; #  busy的buffer保持最小. 与 proxy_buffer_size 值保持一致
    proxy_buffer_size    32k;           # 最大可以存储32k的header

当然,上面的proxy_buffers的大小还可以进一步的扩大.这个取决于你的body的大小和你的机器的配置.

评论

发表评论


取消