Erreur 504 Gateway Timeout : Diagnostic Complet

Comprendre et résoudre les timeouts entre proxy et backend.

L'erreur 504 Gateway Timeout indique que votre serveur proxy (Nginx, Apache, ou un load balancer) a attendu trop longtemps une réponse du backend sans jamais la recevoir. Le backend n'est pas nécessairement down - il est juste trop lent.

C'est une erreur insidieuse car elle signale souvent un problème de performance sous-jacent. Une requête qui prend 30 secondes aujourd'hui en prendra 60 demain si la cause n'est pas traitée. L'erreur 504 est le symptôme, pas la maladie.

Ce guide vous aide à diagnostiquer la cause profonde des timeouts et à mettre en place des solutions durables plutôt que de simplement augmenter les délais.

Comprendre l'Erreur 504 Gateway Timeout

L'erreur 504 se produit quand le délai d'attente est dépassé :

  • Le mécanisme du timeout : Le proxy configure un délai maximum (ex: 60 secondes). Si le backend n'a pas répondu dans ce délai, le proxy abandonne et retourne 504.
  • Backend toujours actif : Contrairement à une 502, le backend continue souvent de traiter la requête. Vous pouvez avoir des traitements orphelins qui consomment des ressources.
  • Variabilité : La même page peut fonctionner ou échouer selon la charge du moment, la complexité de la requête, ou l'état de la base de données.
  • Impact utilisateur : L'utilisateur attend longtemps avant de voir l'erreur. C'est pire qu'un échec immédiat car il a perdu son temps.

Causes Principales des Timeouts

Voici les causes les plus fréquentes d'une erreur 504 :

  • Requêtes SQL lentes : Une requête sans index parcourt des millions de lignes. La base de données met 2 minutes à répondre mais le proxy n'attend que 60 secondes.
  • API externe lente : Votre application appelle une API tierce qui ne répond pas. Le thread est bloqué en attente indéfiniment.
  • Traitement lourd : Génération de PDF, export CSV massif, calculs complexes. Certaines opérations prennent légitimement du temps.
  • Saturation des workers : Tous les workers PHP-FPM sont occupés. Les nouvelles requêtes attendent dans une queue qui finit par expirer.
  • Deadlocks base de données : Deux transactions se bloquent mutuellement. La requête reste en attente jusqu'au timeout.

Étapes de Diagnostic

Pour identifier la cause d'un timeout :

  1. Identifier les requêtes lentes : Activez le slow query log de votre base de données. Les requêtes > 1 seconde sont des suspectes.
  2. Profiler l'application : Utilisez un APM (Blackfire, New Relic) pour voir où le temps est consommé : code, DB, appels externes.
  3. Vérifier les appels externes : Loggez le temps des appels API. Une API tierce défaillante peut bloquer toute votre application.
  4. Analyser les patterns : La 504 arrive-t-elle sur des pages spécifiques ? À certaines heures ? Sous forte charge ? Les patterns révèlent la cause.
  5. Reproduire le problème : Identifiez une URL qui timeout de manière reproductible. C'est votre cas de test pour valider les corrections.

Commandes de Diagnostic

Voici les commandes pour investiguer les timeouts :

# Activer le slow query log MySQL
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1;
SHOW VARIABLES LIKE "slow_query_log_file";

# Analyser les requêtes lentes
mysqldumpslow /var/log/mysql/slow.log | head -20

# Vérifier les processus MySQL actifs
mysql -e "SHOW FULL PROCESSLIST;" | grep -v Sleep

# Vérifier les workers PHP-FPM occupés
SCRIPT_NAME=/status SCRIPT_FILENAME=/status REQUEST_METHOD=GET cgi-fcgi -bind -connect /var/run/php/php-fpm.sock

# Timeout dans les logs Nginx
grep "upstream timed out" /var/log/nginx/error.log | tail -20

# Mesurer le temps de réponse d'une page
time curl -s -o /dev/null -w "%{time_total}" https://example.com/slow-page

Le slow query log est votre premier allié. La plupart des timeouts viennent de requêtes SQL non optimisées. Les commandes curl permettent de mesurer et comparer.

Solutions Selon la Cause

Appliquez la solution correspondant à votre diagnostic :

  • Requêtes SQL : Ajoutez les index manquants (EXPLAIN pour identifier), réécrivez les requêtes inefficaces, paginez les résultats volumineux.
  • Appels externes : Définissez des timeouts courts (5-10s) sur vos appels HTTP. Utilisez des circuit breakers pour les API instables.
  • Traitements lourds : Déplacez vers des jobs asynchrones (queue). Retournez immédiatement un statut et traitez en background.
  • Augmenter les timeouts : En dernier recours seulement. Augmentez proxy_read_timeout dans Nginx, mais cherchez d'abord à optimiser.

Prévention des Timeouts

Évitez les futurs timeouts avec ces bonnes pratiques :

  • Monitoring des temps de réponse : Avec MoniTao, configurez des alertes si le temps de réponse dépasse un seuil. Une page qui passe de 1s à 5s va bientôt timeout.
  • Code reviews orientées perf : Revoyez les requêtes SQL et appels externes lors des code reviews. N+1 queries et appels sans timeout sont des bombes à retardement.
  • Tests de charge : Simulez la charge de production. Les timeouts apparaissent souvent sous charge mais pas en développement.
  • Architecture asynchrone : Toute opération qui peut prendre > 10 secondes devrait être asynchrone. Webhooks, exports, envois d'emails : queue everything.

Checklist Diagnostic 504

  • Activer et analyser le slow query log
  • Identifier les pages/endpoints qui timeout
  • Vérifier les appels API externes et leurs timeouts
  • Contrôler la charge des workers backend
  • Profiler le code des pages lentes
  • Mettre en place du monitoring temps de réponse

Questions Fréquentes

Dois-je simplement augmenter le timeout ?

C'est une solution temporaire, pas une vraie fix. Augmenter le timeout masque le problème qui va empirer. Optimisez d'abord, augmentez ensuite si vraiment nécessaire.

Comment configurer un timeout par page ?

Dans Nginx, utilisez des blocs location avec différents proxy_read_timeout. Les pages d'export peuvent avoir 300s, les pages normales 60s.

Le timeout 504 affecte-t-il le SEO ?

Oui, Google pénalise les sites lents. De plus, si le crawler reçoit des 504 régulièrement, il réduira la fréquence d'exploration et votre indexation souffrira.

Comment détecter les timeouts avant les utilisateurs ?

Configurez un monitoring avec MoniTao et des seuils de temps de réponse. Une alerte à 5 secondes vous prévient avant que ça ne timeout à 60 secondes.

Puis-je retourner une réponse partielle au lieu de 504 ?

Non, HTTP ne permet pas ça. Mais vous pouvez implémenter un pattern où vous retournez immédiatement une page avec un spinner qui poll pour le résultat.

Les 504 sont-elles loggées côté application ?

Pas toujours. Le proxy coupe la connexion mais l'application peut continuer à traiter. Loggez le temps de traitement côté application pour corréler.

Conclusion

L'erreur 504 Gateway Timeout est le signe que votre application a besoin d'attention. Elle révèle des problèmes de performance qui, ignorés, vont s'aggraver avec la croissance du trafic.

MoniTao vous aide à détecter ces problèmes tôt grâce au monitoring du temps de réponse. Configurez des alertes progressives : warning à 3 secondes, critical à 10 secondes. Vous aurez le temps d'agir avant le timeout.

Prêt à dormir sur vos deux oreilles ?

Commencez gratuitement, sans carte bancaire.