Ein 504-Gateway-Timeout-Fehler in Nginx bedeutet, dass der Server, auf dem Nginx läuft, keine Antwort vom Proxy-Server innerhalb der angegebenen Zeitspanne erhalten konnte. Dies geschieht in der Regel, weil der Proxyserver die Anfrage nicht innerhalb der angegebenen Zeit verarbeiten kann oder weil es Verbindungsprobleme zwischen Nginx und dem Proxyserver gibt.
Der Fehler tritt auf, wenn der Nginx-Server im Proxy-Modus läuft. Dies geschieht, wenn php-fpm oder Apache verwendet wird. Übersetzt aus dem Englischen ins Russische ergibt sich folgendes Bild: Die Wartezeit auf eine Antwort des Servers wurde überschritten.
Es gibt mehrere Gründe für dieses Verhalten:
Lassen Sie uns nun darüber sprechen, was Sie tun können und wie Sie den 504 Gateway Timeout Fehler beheben können.
Das erste, was Sie in der Praxis ausprobieren sollten, ist, dass Sie, wenn Ihr Server, php-fpm oder Apache zu wenig Systemressourcen hat, wie z.B. Arbeitsspeicher oder CPU, den freien
Arbeitsspeicher mit dem Befehl free ermitteln:
$ free -h
Die CPU-Auslastung können Sie mit dem Befehl htop
herausfinden:
$ htop
Wenn Sie sehen, dass PHP die gesamte CPU-Zeit beansprucht, bedeutet dies, dass das Problem bei den Serverressourcen liegt. Sie können versuchen, sich mit der Site-Engine zu befassen, die Ressourcen zu optimieren oder einen leistungsstarken VPS-Server zu wählen.
Die zweite Option - wenn es so geplant war, dass das Skript für eine lange Zeit arbeitete. In diesem Fall müssen Sie Nginx so konfigurieren, dass es auf eine Antwort von Apache oder php-fpm wartet. Um das Problem im Falle von php-fpm zu lösen, müssen Sie nur zwei Zeilen in den Konfigurationsblock von fastgci einfügen:
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
300 bedeutet 300 Sekunden, was für die meisten Skripte ausreicht, aber es ist auch nicht schwierig, bei Bedarf mehr einzustellen. Der 504-Fehler kann auch auftreten, wenn Nginx als Proxy für Apache oder einen anderen Webserver verwendet wird, dann müssen Sie auch die Wartezeit für den Proxy konfigurieren.
Fügen Sie diese Zeilen in den Server-Abschnitt
ein:
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
In diesem Fall haben wir einen Timeout von 600 Sekunden.
Jetzt müssen wir Nginx neu starten:
$ sudo systemctl restart nginx
Ein weiterer Grund und die Lösung, wenn das Skript hängen bleibt. Wenn Sie das Skript selbst ausführen, werden Sie sofort sehen, was passiert, aber wenn ein solcher Fehler bei den Benutzern auftritt, ist das ein ernsthafteres Problem. Mit dem Befehl können Sie sehen, ob Ihre Benutzer auf solche Fehler stoßen und wo sie auftreten:
$ fgrep -i " 504 " /var/log/nginx/access.log
Detailliertere Informationen können manchmal in error.log
eingesehen werden:
$ fgrep -i " 504 " /var/log/nginx/error.log
Wenn php-fpm das Problem ist, können Sie außerdem mit der eingebauten slow-log-Funktion
feststellen, welche Skripte langsam laufen.
Um sie zu aktivieren, fügen Sie die folgenden Zeilen in Ihre Pool-Konfiguration ein:
$ sudo vi /etc/php-fpm.d/www.conf
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s
Damit ist die Anweisung abgeschlossen.