NeahNew/NGINX_HEADER_SIZE_FIX.md
2026-01-07 10:32:42 +01:00

157 lines
4.1 KiB
Markdown

# 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`** :
```nginx
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 :
```nginx
server {
# ... autres configs ...
# Augmenter la limite des headers
large_client_header_buffers 4 32k;
# ... reste de la config ...
}
```
**Puis redémarrer Nginx** :
```bash
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)
```typescript
// Dans JWT callback
token.idToken = account.id_token ?? ''; // ❌ Supprimer cette ligne
```
**Option B** : Stocker seulement les tokens nécessaires
```typescript
// 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
```nginx
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** :
```bash
sudo nginx -t
```
2. **Recharger Nginx** :
```bash
sudo systemctl reload nginx
```
3. **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