Nota: Este artículo fue publicado originalmente en 2014. Algunos pasos, comandos o versiones de software pueden haber cambiado. Consulta la documentación actual de NginX para la información más reciente.

Uno de los problemas más frustrantes que enfrentan los desarrolladores web cuando usan Nginx frente a una aplicación moderna es el error “400 Bad Request - Request Header Or Cookie Too Large”.

Este error a menudo parece surgir de la nada: el sitio funciona perfectamente hasta que un usuario navega por demasiadas páginas, inicia sesión mediante un proveedor SSO (como OAuth o SAML) o acumula demasiadas cookies de seguimiento. De repente, Nginx arroja un 400 Bad Request, y la aplicación backend ni siquiera registra el tráfico.

Cuando un navegador realiza una petición HTTP a tu servidor Nginx, envía todas las cookies asociadas con ese dominio en los encabezados (headers) HTTP. Las aplicaciones modernas a menudo almacenan grandes JSON Web Tokens (JWTs), datos de sesión o docenas de cookies de análisis (Google Analytics, Facebook Pixel, etc.).

Nginx asigna búferes de memoria para leer estas solicitudes entrantes. De forma predeterminada, Nginx establece el tamaño de un único búfer en 8K (8192 bytes) en la mayoría de las plataformas.

Si la combinación de todas las cookies en el encabezado Cookie: (o cualquier otra línea de encabezado individual) supera este límite de 8 KB, Nginx rechaza inmediatamente la solicitud y devuelve un error 400 Bad Request. Lo hace para protegerse contra posibles ataques de desbordamiento de búfer (buffer overflow).

Cómo solucionar el error en Nginx (nginx.conf)

La solución es sencilla: debes indicarle explícitamente a Nginx que permita encabezados más grandes usando la directiva large_client_header_buffers.

Esta directiva es válida dentro de los bloques http o server.

server {
    listen 80;
    server_name ejemplo.com;

    # Aumentar el tamaño del búfer para manejar cookies grandes (ej. tokens JWT)
    # Sintaxis: large_client_header_buffers <número> <tamaño>;
    large_client_header_buffers 4 16k;

    location / {
        proxy_pass http://backend;
    }
}

Detalle Crucial: La línea de solicitud (p. ej., GET /url-muy-larga HTTP/1.1) no puede ser más grande que el tamaño de un solo búfer. De la misma manera, la línea de encabezado más larga (que usualmente es el encabezado Cookie:) no debe exceder el tamaño de un búfer. Por lo tanto, debes aumentar el tamaño (por ejemplo, de 8k a 16k o 32k), no solo la cantidad de búferes. Escribir large_client_header_buffers 8 8k; NO solucionará un problema de una cookie de 10 KB.

Solucionarlo en Kubernetes Nginx Ingress

Si estás ejecutando Nginx dentro de un clúster de Kubernetes usando el Nginx Ingress Controller, normalmente no puedes editar el archivo nginx.conf directamente. En su lugar, aplicas el cambio globalmente mediante el ConfigMap, o de forma local mediante una anotación (annotation) en tu recurso Ingress.

Localmente vía Ingress Annotation:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: mi-app-ingress
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |
      large_client_header_buffers 4 32k;
spec:
  # ...

Globalmente vía ConfigMap: Modifica tu ConfigMap de ingress-nginx-controller para incluir:

data:
  large-client-header-buffers: "4 32k"

¿Por qué este error parece aleatorio?

Es difícil detectar este error proactivamente porque depende completamente del usuario. Solo afecta a aquellos usuarios específicos que han acumulado una carga masiva de cookies por encima de la capacidad asignada.

  • Escenario 1: Un usuario navega por tu sitio a lo largo del tiempo, almacenando cookies de publicidad y rastreo. Llega un momento en que supera el límite de 8 KB y el sitio deja de funcionar por completo. Mientras tanto, un usuario nuevo (o en modo Incógnito) accede a las mismas páginas sin problemas.
  • Escenario 2: Un endpoint de tu aplicación establece una cookie de sesión JWT masiva. Cualquiera que inicie sesión obtiene un error 400 en su próxima solicitud.

En ambos casos, borrar las cookies del navegador para ese dominio “solucionará” instantáneamente el problema para el usuario (lo cual es útil para dar soporte técnico rápido), pero la verdadera solución permanente es siempre aumentar el tamaño del búfer en tu configuración de Nginx.

Artículos Relacionados