Come gestire un cookie troppo grande, facendo sì che Nginx restituisca un 502?
Il nostro server Nginx sta attualmente restituendo un 502 per un utente, per la nostra applicazione basata su NodeJS e i log degli errori indicano:
2670 upstream sent too big header while reading response header from upstream
Ciò sembra essere causato da un cookie troppo grande (l'intestazione supera i 4K su richiesta) e non siamo sicuri di come gestire questa situazione, oltre a dire all'utente di cancellare i propri cookie per il sito. Qualche suggerimento su come affrontare questo problema?
La configurazione del passaggio proxy nel nostro file 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;
}
Un ulteriore test, passando l'istanza Nginx, mostra che il server Node.JS upstream può gestire il file più grande di 4KB, suggerendo che il problema è a livello di Nginx.
Il nostro ambiente:
Server Node.js 10.19.0 basato su Express, fronteggiato da Nginx 1.14.0 su un sistema basato su Ubuntu. L'applicazione in esecuzione sul server Node.js utilizza Quasar SSR.
Risposte
La soluzione con cui ho finito è stata quella di aumentare il buffer per la dimensione dell'intestazione a 16K, sulla base di un articolo e della documentazione di Nginx :
proxy_buffers 8 16k; # Buffer pool = 8 buffers of 16k
proxy_buffer_size 16k; # 16k of buffers from pool used for headers
Per citare i testi specifici della documentazione:
Su proxy_buffers
:
Sintassi:
proxy_buffers number size;
Predefinito:proxy_buffers 8 4k|8k;
Contesto:http, server, location
Imposta il numero e la dimensione dei buffer utilizzati per leggere una risposta dal server proxy, per una singola connessione. Per impostazione predefinita, la dimensione del buffer è uguale a una pagina di memoria. Questo è 4K o 8K, a seconda della piattaforma.
Su proxy_buffer_size
:
Sintassi:
proxy_buffer_size size;
Predefinito:proxy_buffer_size 4k|8k;
Contesto:http, server, location
Imposta la dimensione del buffer utilizzato per leggere la prima parte della risposta ricevuta dal server proxy. Questa parte di solito contiene una piccola intestazione di risposta. Per impostazione predefinita, la dimensione del buffer è uguale a una pagina di memoria. Questo è 4K o 8K, a seconda della piattaforma. Tuttavia, può essere ridotto.