157 lines
4.1 KiB
Markdown
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
|
|
|
|
|