504 Gateway Timeout
Utilisation
Le code de statut 504 Gateway Timeout signifie que le serveur agit comme proxy ou passerelle devant un serveur en amont. Après avoir reçu la requête HTTP, le serveur a tenté de la transmettre au serveur en amont, mais n’a reçu aucune réponse dans le délai imparti.
Ce code est apparenté au code de statut 502 Bad Gateway. Un 502 indique que le serveur en amont a renvoyé une réponse invalide, tandis qu’un 504 indique qu’aucune réponse n’a été reçue du tout.
Les délais d’expiration propres à chaque plateforme varient. L’API Shopify applique un délai de 10 secondes par requête et renvoie 504 Gateway Timeout lorsque la réponse n’est pas prête dans cette fenêtre. Les développeurs qui travaillent avec l’API Shopify doivent optimiser leurs requêtes et recourir à des traitements en arrière-plan pour les opérations dépassant cette limite.
Impact SEO
Googlebot interprète les erreurs 5xx comme un signal l’invitant à réduire temporairement sa fréquence d’exploration sur l’ensemble du site. Les URL déjà indexées sont d’abord conservées, mais une indisponibilité prolongée amène Google à les retirer de l’index. Tout contenu renvoyé avec une réponse 504 est ignoré. Dans sa documentation, Google regroupe explicitement 500, 502 et 503 sous l’appellation d’erreurs serveur. Un 504 relève de la même catégorie générale d’erreurs 5xx. Une erreur 5xx sur le fichier robots.txt est bien plus grave, même si toutes les autres pages du site renvoient 200. Google interrompt l’exploration pendant jusqu’à 12 heures, puis se rabat sur une copie en cache pendant jusqu’à 30 jours. Si l’erreur persiste, Google désindexe entièrement le site. Bingbot traite lui aussi les réponses 5xx comme des échecs d’exploration. Des erreurs 5xx persistantes empêchent l’indexation dans Bing.
Exemple
Le client demande une ressource et le serveur répond avec le code de statut 504 Gateway Timeout, car le serveur en amont n’a pas renvoyé de réponse HTTP.
Requête
GET /news HTTP/1.1
Host: example.com
Réponse
HTTP/1.1 504 Gateway Timeout
Content-Type: text/html; charset=UTF-8
Content-Length: 128
<html>
<head>
<title>Gateway Timeout</title>
</head>
<body>
<p>The server is not responding.</p>
</body>
</html>
Comment corriger
Le proxy a expiré en attendant la réponse du backend. La correction consiste soit à augmenter le délai d’expiration, soit à accélérer le backend.
Augmentez les délais d’expiration du proxy.
Dans nginx, le délai par défaut est de 60 secondes. Augmentez les directives concernées dans le bloc server ou location :
Dans Apache, définissez ProxyTimeout 300 dans l’hôte virtuel ou la configuration globale. Avec mod_proxy_fcgi, c’est le paramètre timeout de la directive ProxyPassMatch qui contrôle l’attente.
Alignez les délais d’expiration du backend. Le processus backend doit disposer d’un délai équivalent ou supérieur. Pour PHP, augmentez max_execution_time dans php.ini et request_terminate_timeout dans la configuration du pool PHP-FPM. Pour Node.js, définissez server.timeout. Pour Gunicorn, utilisez —timeout.
Optimisez l’opération lente du backend. Un délai dépassé est le symptôme d’une opération lente. Profilez la requête pour localiser le goulet d’étranglement :
Respectez les délais imposés par la plateforme. Les plateformes hébergées appliquent des limites strictes plus courtes que les valeurs par défaut habituelles des proxys. Shopify impose un plafond de 10 secondes. Pour les opérations dépassant la limite de la plateforme, déportez le travail vers des tâches en arrière-plan et interrogez le résultat par sondage au lieu de bloquer la requête HTTP.
Vérifiez le chemin réseau. Contrôlez la connectivité entre le proxy et le backend avec curl ou telnet. Pertes de paquets, lenteurs DNS ou règles de pare-feu sur les sauts intermédiaires contribuent tous aux dépassements de délai. Lancez traceroute pour identifier les segments réseau lents.
Ajoutez de la mise en cache. Pour les requêtes idempotentes, mettre la réponse en cache au niveau du proxy évite de répéter des appels lents vers le backend. proxy_cache_path de nginx et mod_cache d’Apache réduisent tous deux la charge en amont.
Références de code
.NET
HttpStatusCode.GatewayTimeout
Rust
http::StatusCode::GATEWAY_TIMEOUT
Rails
:gateway_timeout
Go
http.StatusGatewayTimeout
Symfony
Response::HTTP_GATEWAY_TIMEOUT
Python3.5+
http.HTTPStatus.GATEWAY_TIMEOUT
Java
java.net.HttpURLConnection.HTTP_GATEWAY_TIMEOUT
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_GATEWAY_TIMEOUT
Angular
@angular/common/http/HttpStatusCode.GatewayTimeout