NeahNew/NGINX_HEADER_SIZE_FIX.md
2026-01-04 12:51:58 +01:00

4.1 KiB

Fix Erreur 502 - Headers trop grands (Nginx)

🔍 Problème Identifié

Erreur Nginx :

upstream sent too big header while reading response header from upstream

Cause : Le cookie de session NextAuth est trop grand (> 4KB par défaut dans Nginx). Le JWT contient :

  • accessToken (Keycloak) - ~1-2KB
  • refreshToken (Keycloak) - ~1-2KB
  • idToken (Keycloak) - ~1-2KB
  • Données utilisateur (roles, etc.) - ~500B-1KB
  • Total : ~4-7KB, ce qui dépasse la limite Nginx par défaut

Solutions

Solution 1 : Augmenter la limite Nginx (RECOMMANDÉ)

Fichier : Configuration Nginx (généralement /etc/nginx/sites-available/hub.slm-lab.net ou similaire)

Ajouter dans le bloc server ou location :

server {
    # ... autres configs ...
    
    # Augmenter la taille maximale des headers
    proxy_buffer_size 16k;
    proxy_buffers 8 16k;
    proxy_busy_buffers_size 32k;
    large_client_header_buffers 4 32k;
    
    # Spécifiquement pour les headers de réponse
    proxy_headers_hash_max_size 512;
    proxy_headers_hash_bucket_size 128;
    
    # ... reste de la config ...
}

OU pour une solution plus simple, ajouter seulement :

server {
    # ... autres configs ...
    
    # Augmenter la limite des headers
    large_client_header_buffers 4 32k;
    
    # ... reste de la config ...
}

Puis redémarrer Nginx :

sudo nginx -t  # Vérifier la config
sudo systemctl reload nginx  # Ou sudo service nginx reload

Solution 2 : Réduire la taille du JWT (ALTERNATIVE)

Si on ne peut pas modifier Nginx, on peut réduire la taille du JWT en ne stockant pas tous les tokens.

Modification : app/api/auth/options.ts

Option A : Ne pas stocker idToken dans le JWT (si pas nécessaire)

// Dans JWT callback
token.idToken = account.id_token ?? '';  // ❌ Supprimer cette ligne

Option B : Stocker seulement les tokens nécessaires

// Stocker seulement accessToken et refreshToken
// idToken peut être récupéré depuis Keycloak si nécessaire

Note : Cette solution réduit la fonctionnalité. La Solution 1 est préférable.

🔧 Configuration Nginx Complète Recommandée

server {
    listen 443 ssl http2;
    server_name hub.slm-lab.net;
    
    # ... SSL config ...
    
    # Augmenter les limites pour les gros headers NextAuth
    proxy_buffer_size 16k;
    proxy_buffers 8 16k;
    proxy_busy_buffers_size 32k;
    large_client_header_buffers 4 32k;
    
    # Timeouts
    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;
    
    location / {
        proxy_pass http://172.16.0.102:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
        
        # Headers pour NextAuth
        proxy_set_header Cookie $http_cookie;
    }
}

📊 Vérification

Après modification Nginx :

  1. Tester la config :
sudo nginx -t
  1. Recharger Nginx :
sudo systemctl reload nginx
  1. Tester la connexion :
  • Se connecter via Keycloak
  • Vérifier que l'erreur 502 ne se produit plus
  • Vérifier les logs Nginx pour confirmer

🎯 Cause Technique

NextAuth crée un cookie JWT qui contient :

  • Le JWT encrypté avec NEXTAUTH_SECRET
  • Le JWT contient tous les tokens Keycloak
  • La taille totale peut dépasser 4KB

Nginx a une limite par défaut de 4KB pour les headers de réponse. Quand Next.js essaie de renvoyer un cookie > 4KB, Nginx rejette avec "upstream sent too big header".

Solution Immédiate

Action : Modifier la configuration Nginx pour augmenter large_client_header_buffers à au moins 4 32k ou 8 16k.

Impact : Résout immédiatement l'erreur 502.


Document créé le : $(date) Priorité : HAUTE - C'est la cause de l'erreur 502