如何處理一個太大的cookie,導致Nginx返回一個502?
我們的 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,具體取決於平台。然而,它可以做得更小。