对于基于 NodeJS 的应用程序,我们的 Nginx 服务器当前正在为用户返回 502,错误日志表明:
2670 upstream sent too big header while reading response header from upstream
这似乎是由 cookie 太大引起的(标头根据请求超过 4K),除了告诉用户清除网站的 cookie 之外,我们不确定如何处理这种情况。关于如何处理这个问题有什么建议吗?
我们的 nginx 文件中的代理传递配置:
location / {
proxy_pass http://localhost:8081;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_set_header x-forwarded-host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
}
通过传递 Nginx 实例进行的进一步测试显示上游 Node.JS 服务器可以处理大于 4KB 的文件,表明问题出在 Nginx 级别。
我们的环境:
基于 Express 的 Node.js 10.19.0 服务器,在基于 Ubuntu 的系统上以 Nginx 1.14.0 为前端。在 Node.js 服务器上运行的应用程序使用 Quasar SSR。
答案1
我最终采用的解决方案是将标头大小的缓冲区增加到 16K,基于文章和Nginx 文档:
proxy_buffers 8 16k; # Buffer pool = 8 buffers of 16k
proxy_buffer_size 16k; # 16k of buffers from pool used for headers
引用文档中的具体文本:
在proxy_buffers
:
语法:
proxy_buffers number size;
默认:proxy_buffers 8 4k|8k;
上下文:http, server, location
对于单个连接,设置用于从代理服务器读取响应的缓冲区的数量和大小。默认情况下,缓冲区大小等于一页内存。这是 4K 或 8K,具体取决于平台。
在proxy_buffer_size
:
语法:
proxy_buffer_size size;
默认:proxy_buffer_size 4k|8k;
上下文:http, server, location
设置用于读取从代理服务器收到的响应的第一部分的缓冲区的大小。这部分通常包含一个小的响应头。默认情况下,缓冲区大小等于一页内存。这是 4K 或 8K,具体取决于平台。然而,它可以做得更小。