Nginx + php-fpm "504 Gateway Timeout" -Fehler mit fast null Last (auf einem Testserver)

29

Nach 6-stündigem Debuggen gebe ich dies auf: |

Wir haben ein nginx + php-fpm + mysql im LAN mit fast 100 WordPress (erstellt und verwendet von verschiedenen Designern / Entwicklern, die alle an der Einrichtung von Test-Wordpres arbeiten)

Wir verwenden Nginx ohne Probleme seit langem.

Heute hat Nginx plötzlich aus heiterem Himmel "504 Gateway Time-out" zurückgegeben ...

Ich habe das Nginx-Fehlerprotokoll auf einen virtuellen Host überprüft ...

2010/09/06 21:24:24 [error] 12909#0: *349 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 21:25:11 [error] 12909#0: *349 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 21:25:11 [error] 12909#0: *443 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /info.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 21:25:12 [error] 12909#0: *443 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:08:32 [error] 12909#0: *1025 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:09:33 [error] 12909#0: *1025 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:09:40 [error] 12909#0: *1064 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /info.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:09:40 [error] 12909#0: *1064 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:24:44 [error] 12909#0: *1313 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:24:53 [error] 12909#0: *1313 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"

Als ich php-fpm über den TCP-Modus auf Port 9000 ausführte , führte ich "netstat | grep 9000" aus und bemerkte etwas Ungewöhnliches ... (Einfügen einer Teilausgabe hier zur Erleichterung des Lesens)

tcp        9      0 localhost:9000          localhost:36094         CLOSE_WAIT  14269/php5-fpm  
tcp        0      0 localhost:46664         localhost:9000          FIN_WAIT2   -               
tcp     1257      0 localhost:9000          localhost:36135         CLOSE_WAIT  -               
tcp     1257      0 localhost:9000          localhost:36125         CLOSE_WAIT  -               
tcp        9      0 localhost:9000          localhost:36102         CLOSE_WAIT  14268/php5-fpm  
tcp        0      0 localhost:46662         localhost:9000          FIN_WAIT2   -               
tcp      745      0 localhost:9000          localhost:46644         CLOSE_WAIT  -               
tcp        0      0 localhost:46658         localhost:9000          FIN_WAIT2   -               
tcp     1265      0 localhost:9000          localhost:46607         CLOSE_WAIT  -               
tcp        0      0 localhost:46672         localhost:9000          ESTABLISHED 12909/nginx: worker
tcp     1257      0 localhost:9000          localhost:36119         CLOSE_WAIT  -               
tcp     1265      0 localhost:9000          localhost:46613         CLOSE_WAIT  -               
tcp        0      0 localhost:46646         localhost:9000          FIN_WAIT2   -               
tcp     1257      0 localhost:9000          localhost:36137         CLOSE_WAIT  -               
tcp        0      0 localhost:46670         localhost:9000          ESTABLISHED 12909/nginx: worker
tcp     1265      0 localhost:9000          localhost:46619         CLOSE_WAIT  -               
tcp     1336      0 localhost:9000          localhost:46668         ESTABLISHED -               
tcp        0      0 localhost:46648         localhost:9000          FIN_WAIT2   -               
tcp     1336      0 localhost:9000          localhost:46670         ESTABLISHED -               
tcp        9      0 localhost:9000          localhost:36108         CLOSE_WAIT  14274/php5-fpm  
tcp     1336      0 localhost:9000          localhost:46684         ESTABLISHED -               
tcp        0      0 localhost:46674         localhost:9000          ESTABLISHED 12909/nginx: worker
tcp     1336      0 localhost:9000          localhost:46666         ESTABLISHED -               
tcp     1257      0 localhost:9000          localhost:46648         CLOSE_WAIT  -               
tcp     1336      0 localhost:9000          localhost:46678         ESTABLISHED -               
tcp        0      0 localhost:46668         localhost:9000          ESTABLISHED 12909/nginx: wo             

Es gibt viele "CLOSE_WAIT" & "FIN_WAIT2" -Paare, wie unten hervorgehoben (in der obigen Ausgabe):

tcp     1337      0 localhost:9000          localhost:46680         CLOSE_WAIT  -               
tcp        0      0 localhost:46680         localhost:9000          FIN_WAIT2   -

Bitte beachten Sie den obigen Port 46680.

Ich habe das Fehlerprotokoll für langsame Abfragen in MySQL aktiviert, aber es hat nicht funktioniert.

Ab sofort starte ich php5-fpm jede Minute über einen Cronjob neu (siehe Befehl unten), damit alles "reibungslos" läuft, aber ich hasse Patchwork und möchte das lösen ...

1 * * * * service php5-fpm restart > /dev/null

Ich habe ausgiebig bei Google gesucht - keine Hilfe bekommen. Wie bereits erwähnt, handelt es sich um einen Testserver im LAN. Die CPU-Auslastung wird nie überschritten. 0,10 und der Arbeitsspeicherbedarf liegen ebenfalls unter 25%. (Auf dem System sind 2 GB RAM und ein Ubuntu-Server installiert.) atleast einen Hinweis fallen.

Vielen Dank im Voraus für Hilfe.

-Rahul

(Hinweis - dies ist ein Reposting von - http://forum.nginx.org/read.php?11,127694 )

Update: Ich habe eine Antwort gefunden, die unten steht.

rahul286
quelle

Antworten:

31

Ich habe eine Antwort auf meinen Beitrag im nginx-Forum gefunden - http://forum.nginx.org/read.php?2,127854

In meinem Fall lautet die Antwort:

request_terminate_timeout=30s

in php-fpm config (normalerweise /etc/php5/fpm/php-fpm.conf)

Beachten Sie, dass Sie auch andere Werte als 30s verwenden können.

Ich habe es verwendet, um meinen Wert in der Hauptdatei php.iniabzugleichen:

max_execution_time = 30

Vielen Dank an alle. :-)

rahul286
quelle
5
Diese Konfiguration finden Sie auch in der www.conf-Datei. Vielen Dank für die Antwort, dies scheint den Trick getan zu haben.
Eddiemoya
2
Dies ist eine Anweisung auf Pool-Ebene. Beim Versuch, sie in die php-fpm.conf- [global]Sektion einzufügen, wird eine Fehlermeldung angezeigt . Es funktioniert dort nur, wenn Sie auch Ihre Pool-Konfigurationen dort haben. Außerdem: request_terminate_timeout docs .
Tanius
Wenn dies die richtige Antwort ist, die ich WIRKLICH BRAUCHE, dann wird dieser Freitag der bisher beste von 2015 sein.
Philip
2
Ich habe festgestellt, dass beim Einfügen request_terminate_timeout=30sin meine php-fpm.confDatei ein Fehler (111 Connection Refused) aufgetreten ist. Als ich es in meine www.confDatei verschoben habe, hat es funktioniert.
AJB
Unter CentOS 7.2 befindet sich request_terminate_timeout unter: /etc/php-fpm.d/www.conf
nadavkav
16

Hier, wie es mein Problem gelöst hat:

Nehmen Sie die folgenden Änderungen an /etc/nginx/nginx.conf in http {section vor

proxy_connect_timeout  600s;
proxy_send_timeout  600s;
proxy_read_timeout  600s;
fastcgi_send_timeout 600s;
fastcgi_read_timeout 600s;

und starten Sie dann nginx neu

/etc/init.d/nginx neu starten

Vijay Kumar
quelle
2
Ja, das sieht wirklich nicht so aus, als hätte es etwas mit dem Problem der Person zu tun, die die Frage stellt.
HopelessN00b
3
aber zum
glück
Dies hat mein Problem nicht behoben, aber es ermöglichte mir, den tatsächlichen Fehler anstelle der Zeitüberschreitungsmeldung zu sehen, die mich zum tatsächlichen Problem führte.
Michael
4

Wenn Sie PHP 5.3 verwenden, erhöhen Sie den Rückstand.

Wenn Sie PHP 5.2 verwenden, portieren Sie den Patch zurück, um das Backlog von 128 zu vergrößern.

Verwenden Sie auch einen Unix-Socket anstelle eines TCP-Sockets. Unix: /tmp/php5-cgi.sock (oder der entsprechende Pfad)

karmawhore
quelle
Ich muss dem zustimmen, insbesondere der Verwendung von Unix-Sockets.
Matt
Danke karmawhore für die Antwort. Ich habe eine Lösung auf der Nginx-Mailingliste gefunden.
rahul286
@ rahul286 welche antwort? ich bin interessiert!
Breiti
@ Breiti siehe meine Anser unten - serverfault.com/a/179136/17440
rahul286
3

Vielen Dank

request_terminate_timeout = 30s

Es funktioniert perfekt für mich

aber ich musste die Zeile in diese Datei einfügen: "/etc/php5/fpm/pool.d/www.conf", das heißt in der "Worker Section".

PHP 5.3.21-1 - Wordpress 3.5.1

http://php-fpm.org/wiki/Configuration_File

Franck
quelle
Ich hatte eine Kombination von Faktoren, die letztendlich den 502-Fehler verursachten. Ihr Rezept hat den Zaubertrick gemacht! vielen vielen Dank!
Jorge Vicente Mendoza
2

In meinem Fall (dieselbe Nginx-Fehlermeldung) hören einige problematische PHP-Skripte nicht auf, ausgeführt zu werden und warten auf etwas, was dazu führt, dass keine Php5-Fpm-Kinder mehr für Nginx ausgewählt werden müssen.

Fix:

  1. Ausführungszeitlimit hinzufügen andere haben es in diesem Beitrag erwähnt. request_terminate_timeout=30s
  2. Kinderzahl erhöhen. und alles funktionierte wie ein Zauber. pm.max_spare_servers=16 pm.min_spare_servers=2

Jetzt funktionierte alles wie ein Zauber.

c2h2
quelle
Ich hatte eine lange laufende externe Verbindungsanfrage in meinem PHP-Skript. Suchen Sie nach diesen lang laufenden Aufgaben und legen Sie eine Auszeit für sie fest.
Ali Nadalizadeh
1

Ich hatte das gleiche Problem und löste es, indem ich Apache vollständig entfernte:

yum remove httpd

Danach empfehle ich, PHP und NGINX neu zu starten:

/etc/init.d/nginx restart
/etc/init.d/php-fpm restart
Nikolay
quelle
1
Wir hatten damals keinen Apache auf unserem Server. Freut mich, Ihren Fall zu kennen, da er uns in Zukunft helfen könnte.
rahul286
0

Bei mir ist das gleiche Problem aufgetreten, nachdem rabbitmq vom Server entfernt wurde. Nichts von dem oben Genannten war nicht nützlich. Das erneute Installieren aller PHP5-Module löste das Problem. Ich hatte Debian 8.2 auf diesem Server. Hoffnung wird für jemanden hilfreich sein.

Taggart-Komet
quelle
-1

Dies kann auch Menschen helfen:

Abhängig von Ihrem Setup sollten Sie die FastCGI-Konfigurationsparameter sowie PHP ... in meinem Fall (ich verwende Apache2 + PHP5-FPM) und die max_execution-Zeit ist auch davon abhängig, wie lange das FastCGI-Modul auf eine Antwort wartet ( -idle-timeout) ...

http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html#FastCgiExternalServer

farinspace
quelle
Warum Apache2 verwenden? Ich meine, Sie können Nginx direkt verwenden, um mit PHP5-FPM zu interagieren. Sie müssen Apache nicht verwenden, wenn Sie Nginx haben!
rahul286
Wenn Sie Nginx verwenden, und wenn andere Nginx NICHT verwenden, hilft Ihnen dies hoffentlich weiter. :-) ... Ich bin auf diese Seite gestoßen, die nach Apache2 + php5-fpm-bezogenen Fragen
gesucht hat
okay. Ich dachte, Sie verwenden Nginx mit Apache für PHP-Skripte, wie es in der Vergangenheit von einigen Leuten verwendet wurde.
rahul286