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-2KBrefreshToken(Keycloak) - ~1-2KBidToken(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 :
- Tester la config :
sudo nginx -t
- Recharger Nginx :
sudo systemctl reload nginx
- 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