Une erreur 504 Gateway Timeout signifie qu’un serveur intermédiaire a demandé quelque chose à un autre serveur et a renoncé à attendre. La page que vous vouliez existe. La machine qui l’aurait construite n’a pas répondu à temps, et la machine placée devant elle a cessé de tenir la porte ouverte.

Si vous êtes visiteur : ce n’est pas votre ordinateur, ni votre navigateur, ni votre connexion. Tout code d’erreur qui commence par 5 est le site lui-même qui signale un problème qui lui appartient. Vider votre cache n’y changera rien, et essayer un autre navigateur non plus.

L’image à deux serveurs

Presque aucun site web n’est une seule machine. Une requête arrive en général sur quelque chose placé devant - un répartiteur de charge, un proxy inverse, un nœud de CDN - et cette chose la transmet à ce qui exécute réellement l’application, puis vous relaie la réponse.

Un 504, c’est le rapport de la machine de devant sur celle de derrière : j’ai demandé, j’ai attendu, rien n’est venu, voici un code de statut pour que vous ne restiez pas devant un onglet vide. L’application du site n’a jamais eu l’occasion de vous dire quoi que ce soit, ce qui explique qu’une page 504 ait l’air générique plutôt que d’avoir l’allure du site autour.

Cela explique aussi le minutage. Un 504 arrive en général après une longue pause - dix secondes, trente, soixante - parce que la pause est justement le sujet. Quelque chose essayait encore.

504 face à 502, que l’on confond sans cesse

Ils viennent du même endroit et ne veulent pas dire la même chose, et savoir lequel vous avez restreint considérablement la cause.

502 Bad Gateway
Le serveur en amont a répondu, et la réponse était inutilisable - une connexion refusée, un processus planté, n'importe quoi sur le fil. En général rapide
504 Gateway Timeout
Le serveur en amont n'a pas répondu du tout dans le temps imparti. En général lent, et le délai avant l'erreur est lui-même un indice

En gros : 502 veut dire « il a dit quelque chose de faux », 504 veut dire « il n’a encore rien dit ». Un 502 pointe vers quelque chose de cassé ou d’arrêté ; un 504 pointe vers quelque chose de lent, de bloqué ou de surchargé.

Une subtilité qui vaut la peine d’être connue, parce que la plupart des articles la manquent : certains fournisseurs utilisent leurs propres codes pour cela. Cloudflare renvoie 524 quand votre origine accepte une connexion puis met trop de temps à répondre, ce qui est la même histoire racontée depuis une autre couche. Si vous êtes derrière un CDN, le numéro que vous recevez peut être le leur plutôt que celui de la norme.

Si vous êtes le visiteur

Il y a très peu à faire, et c’est la réponse honnête plutôt qu’une réponse courte.

Attendez une minute et rechargez. Un 504 est souvent passager - une requête lente, un processus qui redémarre, une pointe de trafic. S’il persiste, regardez si le service a une page d’état ou si quelqu’un d’autre le signale, parce que la panne est de leur côté et qu’eux seuls peuvent la corriger.

La seule chose vraiment utile que vous puissiez faire, c’est de leur dire, avec assez de détails pour qu’ils la retrouvent. Quelle page, à quelle heure, et ce que vous étiez en train de faire. Un 504 sur un paiement à 14h32, c’est quelque chose qu’un ingénieur peut aller chercher dans un journal ; « votre site est en panne » ne l’est pas.

Si c’est votre site

Quatre causes expliquent la plupart d’entre eux, à peu près dans cet ordre.

  • Une chose lente. Une requête en base sans index, une API externe que vous appelez pendant que l’utilisateur attend, un rapport qui a dépassé la taille pour laquelle il avait été prévu. La requête n’est pas bloquée, elle est seulement plus lente que la patience du proxy.
  • Un délai réglé en dessous de la réalité. Nginx utilise par défaut soixante secondes pour une lecture relayée. Si votre requête légitime la plus lente en prend quatre-vingt-dix, vous servirez des 504 aux gens qui utilisent la fonctionnalité qui compte le plus.
  • Des workers épuisés. Tous les processus applicatifs sont occupés, donc les nouvelles requêtes font la queue derrière eux et n’atteignent jamais le code. Celle-ci arrive par vagues et donne l’impression que le site tombe entièrement, parce que c’est en effet le cas.
  • Le chemin réseau. Un groupe de sécurité, un changement DNS, un service qui a déménagé. Moins courant, et en général total plutôt qu’intermittent.

Découvrez quelle couche l’a émis avant de changer quoi que ce soit. Le journal d’accès du proxy enregistre le statut qu’il a renvoyé et combien de temps il a attendu ; le journal applicatif montrera soit une requête qui a pris ce temps-là, soit rien du tout à ce moment. Ces deux cas appellent des correctifs opposés, et deviner entre les deux, c’est ainsi que l’on finit par relever un délai qui n’a jamais été le problème.

Relever le délai est le geste tentant et, à lui seul, il est en général mauvais. Il transforme un échec rapide en échec lent et déplace la file d’attente ailleurs. C’est le bon geste uniquement quand vous savez que le travail prend légitimement ce temps-là et ne peut pas être rendu asynchrone.

Session Replay

Extension Chrome gratuite. Un clic sur la page qui se comporte mal capture la copie d'écran, la console et le journal réseau, et vous rend un lien à coller dans le ticket.

Installer l'extension

Pourquoi ils sont si difficiles à traquer après coup

Un 504 est un instant. Le temps que quelqu’un en parle, la requête lente est terminée, les workers se sont vidés, la vague est passée, et la page se charge parfaitement quand vous essayez.

Le signalement arrive donc sous la forme « c’était cassé tout à l’heure » et il n’y a rien à regarder. Ce qui le rendrait trouvable, c’est ce que le navigateur a vu sur le moment : quelle requête a expiré, vers quel hôte, combien de temps elle a attendu, et quoi d’autre sur la page avait déjà échoué. Cela se trouve dans le panneau réseau tant que cela se produit et disparaît dès que l’onglet est fermé.

C’est l’argument pour le capturer sur le moment plutôt que de le décrire après coup - un fichier HAR est la façon habituelle de le faire à la main, et c’est exactement ce que porte le journal réseau d’un rapport de bug. Les mêmes éléments répondent à l’autre question qu’il vaut mieux poser tôt, à savoir si le délai dépassé venait de votre service ou de celui de quelqu’un d’autre : la colonne de l’hôte dit lequel.

En un paragraphe

Un 504 signifie que le serveur de devant a interrogé le serveur de derrière et a manqué de patience. C’est le problème du site et non le vôtre, cela veut en général dire lent plutôt que cassé, et cela se distingue d’un 502 par la pause qui le précède. Si c’est votre site, découvrez quelle couche a expiré avant de toucher au moindre réglage de délai, parce que le journal qui n’a rien enregistré et le journal qui a enregistré quatre-vingt-dix secondes vous racontent deux histoires différentes.