Ce que ça signifie
Le serveur web a transmis la requête à l'application (PHP-FPM, base de données, API externe…), mais n'a pas reçu de réponse dans le délai imparti. Il a attendu, puis abandonné. C'est un timeout — littéralement, le temps a expiré.
La 504 est souvent confondue avec la 502. La différence : en 502, l'application répond mal ou pas du tout. En 504, l'application met trop longtemps à répondre et le proxy perd patience.
Causes fréquentes selon l'environnement
WordPress / PrestaShop
- Requête SQL très lente (base de données volumineuse, plugin qui exécute des requêtes non optimisées)
- Import/export de données volumineux (WooCommerce, catalogue produit, migration)
- Plugin qui fait un appel API externe lent (passerelle de paiement, service tiers qui ne répond pas)
- Page d'administration qui charge trop de données en une seule requête
Symfony / PHP custom
- Requête SQL non optimisée ou absence d'index sur une table volumineuse
- Appel à une API tierce qui ne répond pas (sans timeout configuré côté application, le processus attend indéfiniment)
- Traitement batch lancé via une requête HTTP au lieu d'une commande CLI
- Transaction base de données bloquée (deadlock ou verrou non libéré)
Serveur (Apache / Nginx / Linux)
- Valeur
proxy_read_timeout trop basse dans Nginx (défaut : 60 secondes)
max_execution_time PHP trop bas ou, à l'inverse, trop élevé (un script tourne pendant 5 minutes et bloque un worker)
- Serveur MySQL surchargé ou mal configuré (requêtes en file d'attente)
- Connexion réseau instable entre le serveur web et le serveur de base de données (architectures multi-serveurs)
Premiers gestes
- Identifiez quelle page ou action déclenche la 504. Si c'est une page spécifique (typiquement une page d'export, un tableau de bord avec beaucoup de données, ou un formulaire de recherche complexe), le problème est probablement une requête SQL ou un traitement trop lourd sur cette page.
- Si le problème est général (toutes les pages sont en 504) : vérifiez l'état de la base de données. MySQL est-il accessible ? Lancez un simple
mysqladmin ping en SSH. Si MySQL ne répond pas, redémarrez-le avec sudo systemctl restart mysql.
- Vérifiez les slow query logs de MySQL si ils sont activés (
/var/log/mysql/slow-query.log). Ils révèlent quelles requêtes prennent trop de temps.
- Si un appel API externe est en cause : testez l'API directement (via curl ou le navigateur). Si le service tiers est down, la 504 est un effet collatéral et reviendra à la normale quand le service sera rétabli.
Quand escalader
La 504 est rarement un problème qu'on résout avec un simple redémarrage. Elle révèle généralement un problème de performance sous-jacent (requête mal optimisée, infrastructure sous-dimensionnée, architecture non adaptée à la charge). Si elle se reproduit régulièrement, un audit de performance est recommandé.