Verhindern Sie das Timeout des nginx 504-Gateways mit PHP set_time_limit ()

116

Ich erhalte 504 Timeouts von nginx, wenn mein PHP-Skript länger als gewöhnlich ausgeführt wird. set_time_limit(0)scheint das nicht zu verhindern! Funktioniert es nicht, wenn php5-fpm unter nginx ausgeführt wird? Wenn ja, wie lässt sich das Zeitlimit richtig einstellen?

Error:

504 Gateway Time-out
nginx/1.2.7
Nyxynyx
quelle

Antworten:

193

Es gibt verschiedene Möglichkeiten, wie Sie das Timeout für php-fpm festlegen können. In habe /etc/php5/fpm/pool.d/www.confich diese Zeile hinzugefügt:

request_terminate_timeout = 180

Außerdem habe /etc/nginx/sites-available/defaultich dem Standortblock des betreffenden Servers die folgende Zeile hinzugefügt:

fastcgi_read_timeout 180;

Der gesamte Standortblock sieht folgendermaßen aus:

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_read_timeout 180;
    include fastcgi_params;
} 

Starten Sie jetzt einfach php-fpm und nginx neu und es sollte keine Zeitüberschreitung mehr für Anfragen geben, die weniger als 180 Sekunden dauern.

Pymkin
quelle
2
Falls sich jemand wundert, war die Standardeinstellung für meine (nginx + php5-fpm) 60 Sekunden. Wenn Sie also "Gateway Timeout" für ein Skript mit 60 Sekunden sehen, sollte die Einstellung "fastcgi_read_timeout" hinzugefügt werden
Michael Nguyen
1
Ich habe seit Tagen versucht, dies herauszufinden, und die Antwort von @ pymkin hat für mich funktioniert. Für andere Amateure wie mich, die sich fragen, wie man nginx und php5-fpm neu startet, führen Sie die folgenden zwei Befehle aus: sudo service nginx restart & sudo service php5-fpm restart Das einzige, was ich anders gemacht habe, ist, dass ich diese Einstellungen nur auf einen von angewendet habe meine Websites und nicht die Konfiguration für alle Websites auf meinem Server.
Pamela
4
Leider läuft es nach 60 Sekunden immer noch ab , egal was ich fastcgi_read_timeoutin diesem locationBlock eingestellt habe.
Spencer Williams
Dies sollte die akzeptierte Antwort sein. habe so viele Lösungen ausprobiert, aber nur das funktioniert. Ich habe Laravel Homestead verwendet und hatte einen Timeout-Fehler von 504 Gateways, der das Problem behoben hat.
Anbu369
Wenn Sie Laravel verwenden, müssen Sie dies in dem locationBlock festlegen , der PHP-Skripte verarbeitet, und nicht in der Docroot.
Ryan DuVal
50

Versuchen Sie diesen Link , es hat eine bessere Lösung, wie dies behoben werden kann. Die Schritte sind also:

  1. Öffnen Sie Ihre nginx.confDatei im /etc/nginxVerzeichnis.
  2. Fügen Sie diesen Code unten im http {Abschnitt hinzu:

    client_header_timeout 3000;
    client_body_timeout 3000;
    fastcgi_read_timeout 3000;
    client_max_body_size 32m;
    fastcgi_buffers 8 128k;
    fastcgi_buffer_size 128k;
    

    Hinweis: Wenn es bereits vorhanden ist, ändern Sie die Werte entsprechend.

  3. Laden Sie Nginx und php5-fpm neu.

    $ service nginx reload
    $ service php5-fpm reload
    

    Wenn der Fehler weiterhin besteht, sollten Sie die Werte erhöhen.

arp
quelle
1
Dadurch wird die Ursache nicht gefunden, sondern nur die Zeit bis zum Fehler erhöht. Aber besser wäre es, eine Lösung zu finden, warum es so lange geladen wird. Wenn ich auf localhost bin, bin ich der einzige Client und es wird so lange geladen, dass es überhaupt nicht gut ist, während der Entwicklung zu warten.
Darius.V
16
Die Frage fragt nicht nach einer Ursache für das langsame Skript, sondern nach einer Möglichkeit, den Server länger warten zu lassen. Manchmal müssen Sie spezielle Skripte ausführen, die Aufgaben ausführen, die sehr lange dauern, und das ist keine schlechte Sache.
oder
Aktualisierter (oben) Link: codetweet.com/nginx/…
nadavkav
2
Für diejenigen, die sich fragen, was zu Recht so viel Zeit in Anspruch nehmen würde, könnte es sich beispielsweise um ein Installationsskript von einer Weboberfläche handeln, das versucht, eine Verbindung zu einer Datenbank herzustellen, dann viele erste Tabellen erstellt und diese mit Daten füllt Es könnte einige Zeit dauern, bis eine Antwort eingeht.
Imme
Beachten Sie, dass diese globalen Einstellungen durch die Einstellungen pro Standort in überschrieben werden /etc/nginx/sites-available/mysite.com.
Mac
11

Sie können PHP nicht verwenden, um ein von nginx ausgegebenes Timeout zu verhindern.

Informationen zum Konfigurieren von nginx für mehr Zeit finden Sie in der proxy_read_timeoutDirektive .

Bart
quelle
Dies löste das Problem, bei dem 504s auf meiner Vagabundkiste auftauchten (mit Vaprobash).
Andy Fleming
2
Ich glaube, diese Antwort gilt nur, wenn Sie Nginx nur als Proxyserver verwenden. Dies würde nicht funktionieren, wenn Sie Nginx als primären Webserver verwenden (mit PHP-FPM).
2.
10

Die richtige Antwort ist das Erhöhen von fastcgi_read_timeout in Ihrer Nginx-Konfiguration.
So einfach ist das!

tfont
quelle
7
 sudo nano /etc/nginx/nginx.conf

Fügen Sie diese Variablen zur Datei nginx.conf hinzu:

http {  
  # .....
  proxy_connect_timeout       600;
  proxy_send_timeout          600;
  proxy_read_timeout          600;
  send_timeout                600;
}

Und dann neu starten:

service nginx reload
Kabus
quelle
4

In einem solchen Fall können drei Arten von Zeitüberschreitungen auftreten. Es ist ersichtlich, dass sich jede Antwort nur auf einen Aspekt dieser Möglichkeiten konzentriert. Also dachte ich, ich sollte es aufschreiben, damit jemand, der hier in Zukunft hier ist, nicht jede Antwort nach dem Zufallsprinzip überprüfen und Erfolg haben muss, ohne zu wissen, welche funktioniert.

  1. Timeout der Anforderung vom Anforderer - Timeout-Header muss festgelegt werden (siehe Header-Konfiguration in der anfordernden Bibliothek)
  2. Zeitüberschreitung von nginx während der Anforderung (vor der Weiterleitung an den Proxyserver) Beispiel: Riesige Datei wird hochgeladen
  3. Zeitüberschreitung Nach der Weiterleitung an den Proxyserver antwortet der Server nicht rechtzeitig auf nginx. Beispiel: Zeitaufwändige Skripte, die auf dem Server ausgeführt werden

Die Korrekturen für jedes Problem lauten also wie folgt.

  1. setze Timeout-Header zB: in Ajax

$.ajax({
    url: "test.html",
    error: function(){
        // will fire when timeout is reached
    },
    success: function(){
        //do something
    },
    timeout: 3000 // sets timeout to 3 seconds
});

  1. nginx Client Timeout

    http{
         #in seconds
        fastcgi_read_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;
     }
    
  2. Timeout für Nginx-Proxyserver

    http{
      #Time to wait for the replying server
       proxy_read_timeout 600s;
    
    }
    

Verwenden Sie also die, die Sie benötigen. In einigen Fällen benötigen Sie möglicherweise alle diese Konfigurationen. Ich brauchte.

Gayan Kavirathne
quelle
1

Sie müssen eine zusätzliche Nginx-Direktive (für ngx_http_proxy_module) hinzufügen nginx.conf, z.

proxy_read_timeout 300;

Grundsätzlich proxy_read_timeoutändert die Nginx- Direktive das Proxy-Timeout. Dies FcgidIOTimeoutgilt für Skripte, deren FcgidBusyTimeoutAusführung zu lang ist, und für Skripte, deren Ausführung zu lange dauert.

Wenn Sie die FastCGI-Anwendung verwenden, erhöhen Sie auch diese Optionen:

FcgidBusyTimeout 300
FcgidIOTimeout 250

Laden Sie dann Nginx und PHP5-FPM neu.

Plesk

In Plesk können Sie es in den Webserver-Einstellungen unter Zusätzliche Nginx-Anweisungen hinzufügen .

Für FastCGI überprüfen Sie die Webserver-Einstellungen unter Zusätzliche Anweisungen für HTTP .

Siehe: Wie behebe ich FastCGI-Timeout-Probleme in Plesk?

Kenorb
quelle
Ist die FcgidBusyTimeoutVariable nicht nur für Apache vorhanden?
Slavik
0

Da Sie php-fpm verwenden, sollten Sie fastcgi_finish_request () nutzen, um Anforderungen zu verarbeiten, von denen Sie wissen, dass sie länger dauern können.

Kate
quelle
-1

Die Verwendung set_time_limit(0)ist nutzlos, wenn Sie php-fpm oder einen ähnlichen Prozessmanager verwenden.

Summa summarum ist nicht auf den Einsatz set_time_limitbei der Verwendung php-fpm, Ihre Ausführungs - Timeout zu erhöhen, lesen Sie in diesem Tutorial .

Pangkalizer
quelle
8
Möglicherweise wird hier eine Erklärung für die Antwort gegeben, und diese Antwort kann veraltet sein, wenn der Link abläuft.
Lakshmi
-7

Ich löse dieses Problem mit config APACHE! Alle Methoden (in diesem Thema) sind für mich falsch ... Dann versuche ich chanche apache config:

Timeout 3600

Dann hat mein Skript funktioniert!

NeuroZ
quelle
5
Die Frage lautet nginx. Wenn Sie Probleme mit Apache haben, sollten Sie danach suchen.
Hogan
Die Frage ist auf Nginx und PHP-Fpm nicht Apache.
Kevin Kaburu