Nginx

如何處理一個太大的cookie,導致Nginx返回一個502?

  • August 21, 2020

我們的 Nginx 伺服器目前正在為使用者返回 502,對於我們基於 NodeJS 的應用程序,錯誤日誌表明:

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。

根據一篇文章Nginx 文件,我最終採用的解決方案是將標頭大小的緩衝區增加到 16K :

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,具體取決於平台。然而,它可以做得更小。

引用自:https://unix.stackexchange.com/questions/605467