¿Cómo manejar una cookie demasiado grande que hace que Nginx devuelva un 502?

Aug 21 2020

Nuestro servidor Nginx actualmente está devolviendo un 502 para un usuario, para nuestra aplicación basada en NodeJS y los registros de error indican:

2670 upstream sent too big header while reading response header from upstream

Esto parece ser causado por una cookie demasiado grande (el encabezado supera los 4K en la solicitud) y no estamos seguros de cómo lidiar con esta situación, más allá de decirle al usuario que borre sus cookies para el sitio. ¿Alguna sugerencia sobre cómo lidiar con esto?

La configuración del pase de proxy en nuestro archivo 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;
}

Una prueba adicional, al pasar la instancia de Nginx, muestra que el servidor Node.JS ascendente puede manejar el archivo de más de 4 KB, lo que sugiere que el problema está en el nivel de Nginx.

Nuestro ambiente:

Servidor Node.js 10.19.0 basado en Express, liderado por Nginx 1.14.0 en un sistema basado en Ubuntu. La aplicación que se ejecuta en el servidor Node.js usa Quasar SSR.

Respuestas

2 AndreM Aug 21 2020 at 22:16

La solución con la que terminé fue aumentar el búfer para el tamaño del encabezado a 16 K, según un artículo y la documentación de Nginx :

proxy_buffers         8 16k;  # Buffer pool = 8 buffers of 16k
proxy_buffer_size     16k;    # 16k of buffers from pool used for headers

Para citar los textos específicos de la documentación:

en proxy_buffers:

Sintaxis: proxy_buffers number size;
Predeterminado: proxy_buffers 8 4k|8k;
Contexto:http, server, location

Establece el número y el tamaño de los búferes utilizados para leer una respuesta del servidor proxy, para una sola conexión. De forma predeterminada, el tamaño del búfer es igual a una página de memoria. Esto es 4K u 8K, según la plataforma.

en proxy_buffer_size:

Sintaxis: proxy_buffer_size size;
Predeterminado: proxy_buffer_size 4k|8k;
Contexto:http, server, location

Establece el tamaño del búfer utilizado para leer la primera parte de la respuesta recibida del servidor proxy. Esta parte suele contener un pequeño encabezado de respuesta. De forma predeterminada, el tamaño del búfer es igual a una página de memoria. Esto es 4K u 8K, según la plataforma. Sin embargo, se puede hacer más pequeño.