如何处理太大的cookie,导致Nginx返回502?

如何处理太大的cookie,导致Nginx返回502?

对于基于 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,具体取决于平台。然而,它可以做得更小。

相关内容