
Ich erhalte eine 504-Timeout-Meldung auf meinem Nginx-Server:
504 Gateway Time-out
. Die Website ermöglicht Benutzern das Herunterladen benutzerdefinierter Datendateien. Die Site funktioniert unter den meisten Bedingungen einwandfrei und Benutzer können einige Dateien problemlos herunterladen. Das Problem besteht darin, dass die Datendateien nur auf Anforderung generiert werden. Wenn also komplexe Daten angefordert werden, benötigt das Python-Backend mehr als eine Minute, um die Datei zu generieren und den Download zu starten. Da innerhalb einer Minute keine Antwort erfolgt, gibt Nginx eine zurück 504 Gateway Time-out
. Die Dateien selbst sind CSV-Dateien und nicht sehr groß, sodass die Downloads schnell sind, nachdem das Backend die Datei generiert hat, aber ich brauche eine Möglichkeit, Nginx länger warten zu lassen.
Ich suche nach einer Möglichkeit, das Nginx-Timeout von 1 Minute auf etwa 10 Minuten zu erhöhen.
Bisher habe ich versucht:
Ändern Sie die nginx.conf
Datei so, dass sie die folgenden Zeilen zwischen den http {}
Klammern enthält
uwsgi_connect_timeout 75s;
proxy_connect_timeout 600;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
fastcgi_send_timeout 600s;
fastcgi_read_timeout 600s;
Ich habe auch versucht, eine timeout.conf
Datei hinzuzufügen, /etc/nginx/conf.d/
wie vorgeschlagen vonhttps://asdqwe.net/blog/solutions-504-gateway-timeout-nginx/:
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
Nach jeder Änderung habe ich den Server neu gestartet, aber das Timeout tritt immer noch nach 1 Minute auf. Dies wurde weiter getestet, indem curl -o
auf dem Server ein ausgeführt wurde, um alle Probleme mit dem Dienstanbieter zu umgehen. Die Ausgabe war wie folgt.
$curl -o out-put-file.csv "./localhost/my/url"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 183 100 183 0 0 3 0 0:01:01 0:01:00 0:00:01 48
Und dieser Fehler wird in error.log geschrieben.
2018/03/26 09:55:15 [error] 10105#10105: *1 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 142.1.2.3, server: localhost, request: "GET /my/url", upstream: "uwsgi://unix:/tmp/my-applacation.sock", host: "142.1.2.3"
Wenn ich meine Anwendung ohne Nginx ausführe und sie trotzdem ausführe, curl -o
dauert die Anforderung ziemlich lange (bis zu 8 Minuten, abhängig von den angeforderten Daten), wird aber ordnungsgemäß ohne Fehler oder Zeitüberschreitung abgeschlossen.
Beim Ausführen $ /usr/sbin/nginx -V 2>&1 | grep conf
wird angezeigt, dass sich die Konfigurationsdatei unter folgendem Pfad befindet:--conf-path=/etc/nginx/nginx.conf
Nginx-Version: nginx/1.12.2 und nginx/1.4.6 (Ubuntu)
Betriebssystemversion: Ubuntu 16.04.1 und Ubuntu 14.04.5 LTS
Bearbeiten:
Ich habe getestet, die Anzahl der Worker_Processes in der Konfigurationsdatei zu ändern, nur um sicherzustellen, dass Änderungen an anderen Dingen in der Konfigurationsdatei übernommen wurden, und tatsächlich ändert sich durch die Änderung dieser Zahl die Anzahl der Worker, sodass die Datei die richtige Datei ist und Änderungen von Nginx übernommen werden. Nur keine Änderungen an den Timeouts (oder vielleicht am gesamten HTTP-Abschnitt?). Ich habe auch getestet, die Timeouts auf 30 Sekunden einzustellen, aber sie laufen immer noch nach 1 Minute ab. Außerdem habe ich versucht, diese Einstellungen vorzunehmen, sites-enabled/my_site
aber ich habe immer noch die gleichen Ergebnisse.
Bearbeitung2:
Soweit ich das beurteilen kann, stelle ich die Werte entsprechend der Nginx-Dokumentation richtig ein. uwsgi_connect_timeout
Antwort1
Ich habe es gelöst!!
Das Problem stellte sich als mit uwsgi verbunden heraus, während ich
uwsgi_connect_timeout 75s;
was ich eigentlich einstellen musste war
uwsgi_read_timeout 600s;