Une erreur 504 Gateway Timeout dans Nginx signifie que le serveur exécutant Nginx n'a pas été en mesure de recevoir une réponse du serveur proxy dans le délai spécifié. Cela se produit généralement parce que le serveur proxy ne peut pas traiter la demande dans le délai spécifié ou en raison de problèmes de connexion entre Nginx et le serveur proxy.
L'erreur se produit lorsque le serveur Nginx fonctionne en mode proxy. Cela se produit lorsque php-fpm ou Apache est utilisé. Si nous traduisons cette erreur de l'anglais au russe, nous obtenons ce qui suit : le temps d'attente d'une réponse du serveur a été dépassé.
Plusieurs raisons expliquent ce comportement :
Voyons maintenant ce que vous pouvez faire et comment corriger l'erreur 504 Gateway Timeout.
La première chose à essayer en pratique est que si votre serveur, php-fpm ou apache manque de ressources système, telles que la mémoire ou le CPU, voyez la RAM libre
en utilisant la commande free :
$ free -h
Vous pouvez connaître la charge du processeur avec la commande htop
:
$ htop
Si vous constatez que PHP occupe tout le temps du processeur, cela signifie que le problème se situe au niveau des ressources du serveur. Vous pouvez essayer de modifier le moteur du site, d'optimiser les ressources ou de choisir un serveur VPS puissant.
La deuxième option - si le script a été planifié pour fonctionner pendant longtemps. Dans ce cas, vous devez configurer Nginx pour qu'il attende une réponse d'Apache ou de php-fpm. Pour résoudre le problème dans le cas de php-fpm, il suffit d'ajouter deux lignes au bloc de configuration fastgci :
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
300 signifie 300 secondes, pour la plupart des scripts, c'est suffisant, mais il n'est pas difficile d'en mettre plus si nécessaire. L'erreur 504 peut également se produire lorsque Nginx est utilisé comme proxy pour Apache ou tout autre serveur web, vous devez alors également configurer le temps d'attente pour le proxy.
Ajoutez ces lignes à la section serveur
:
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
Dans ce cas, nous avons un délai d'attente de 600 secondes.
Nous devons maintenant redémarrer Nginx :
$ sudo systemctl restart nginx
Une autre raison et sa solution si le script se bloque. Si vous exécutez le script vous-même, vous verrez immédiatement ce qui bloque, mais si une telle erreur est rencontrée par les utilisateurs, il s'agit d'un problème plus grave. Vous pouvez voir si vos utilisateurs rencontrent de telles erreurs et où elles se produisent en utilisant la commande :
$ fgrep -i " 504 " /var/log/nginx/access.log
Des informations plus détaillées peuvent parfois être trouvées dans le fichier error.log :
$ fgrep -i " 504 " /var/log/nginx/error.log
En outre, si php-fpm est à l'origine du problème, vous pouvez savoir quels scripts s'exécutent lentement à l'aide de la fonction slow-log
intégrée.
Pour l'activer, ajoutez les lignes suivantes à la configuration de votre pool :
$ sudo vi /etc/php-fpm.d/www.conf
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s
Ceci complète l'instruction.