Wie verhindere ich ein Gateway-Timeout mit FastCGI unter Nginx?

203

Ich verwende Django, FastCGI und Nginx. Ich erstelle eine Art API, in der jemand Daten über XML senden kann, die ich verarbeiten und dann einige Statuscodes für jeden Knoten zurückgeben kann, der gesendet wurde.

Das Problem ist, dass Nginx ein 504-Gateway-Timeout auslöst, wenn ich zu lange brauche, um das XML zu verarbeiten - ich denke länger als 60 Sekunden.

Daher möchte ich Nginx so einrichten, dass bei Anfragen, die mit dem Standort / der API übereinstimmen, keine Zeitüberschreitung von 120 Sekunden auftritt. Welche Einstellung wird das erreichen.

Was ich bisher habe ist:

    # Handles all api calls
    location ^~ /api/ {
        proxy_read_timeout 120;
        proxy_connect_timeout 120;
        fastcgi_pass 127.0.0.1:8080;
    }

Edit: Was ich habe funktioniert nicht :)

sheats
quelle
7
Sie können Timeout-Werte auf "2m" anstelle von "120" setzen.
Cenk Alti
1
Es scheint schlecht, dass die Daten nicht gestreamt werden ... dh dass ein Server innerhalb von 60 Sekunden oder länger antwortet, scheint inakzeptabel.
Adam Gent

Antworten:

245

Proxy-Timeouts sind gut für Proxys, nicht für FastCGI ...

Die Richtlinien , die FastCGI Timeouts beeinflussen sind client_header_timeout, client_body_timeoutund send_timeout.

Bearbeiten : In Anbetracht dessen, was im Nginx- Wiki zu finden ist, ist die Anweisung send_timeout dafür verantwortlich, das allgemeine Zeitlimit für die Antwort festzulegen (was etwas irreführend war). Bei FastCGI wirktfastcgi_read_timeout sich dies auf das Antwortzeitlimit für den Fastcgi-Prozess aus .

HTH.

zgoda
quelle
8
Für alle, die uwsgi verwenden und diesen Fehler haben, ist uwsgi_read_timeout 600; mein Problem behoben.
Homer6
2
Meine Frage hier wäre (als Amateur eines Serveradministrators), wohin soll ich das ändern? httpd.conf Datei?
Jeffrey
2
Wenn es hilft, war meins unter / etc / nginx / auf dem DV-System von Media Temple.
Jeffrey
Abdo bietet eine gute Möglichkeit zum Debuggen. Wenn Sie immer noch Probleme haben, müssen Sie möglicherweise die maximale Größe der Client-Nachricht in nginx.conf (client_max_body_size ** M;) erhöhen
Sam Grondahl
2
Das Timeout imho zu erhöhen ist keine richtige Lösung.
JazzCat
24

Für diejenigen, die Nginx mit Einhorn und Schienen verwenden, befindet sich das Zeitlimit höchstwahrscheinlich in Ihrer unicorn.rbDatei

Setzen Sie eine große Zeitüberschreitung in unicorn.rb

timeout 500

Wenn Sie immer noch Probleme haben, versuchen Sie, fail_timeout = 0 in Ihrem Upstream in Nginx zu haben, und prüfen Sie, ob dies Ihr Problem behebt. Dies dient zu Debugging-Zwecken und kann in einer Produktionsumgebung gefährlich sein.

upstream foo_server {
        server 127.0.0.1:3000 fail_timeout=0;
}
Abdo
quelle
3
Ich denke, dass die Leute es abgelehnt haben, weil es um Django geht, aber Ihre Antwort hat mein Gateway-Timeout-Problem mit Rails + Unicorn
behoben
4

In httpnginx Abschnitt (/etc/nginx/nginx.conf) hinzuzufügen oder zu ändern:

keepalive_timeout 300s

In servernginx Abschnitt (/etc/nginx/sites-available/your-config-file.com) fügen Sie folgende Zeilen:

client_max_body_size 50M;
fastcgi_buffers 8 1600k;
fastcgi_buffer_size 3200k;
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;

In der phpDatei im Fall 127.0.0.1:9000 (/etc/php/7.X/fpm/pool.d/www.conf) ändern Sie:

request_terminate_timeout = 300

Ich hoffe dir zu helfen.

Jose Carlos Ramos Carmenates
quelle
Würde etwas "Schlimmes" passieren, wenn ich die Zeit auf 10000 Sekunden ändere?
Udev
Nicht passieren nichts Schlimmes, aber Ihr Service wartet länger. Sie können den Wert beliebig ändern.
Jose Carlos Ramos Carmenates
1

Wenn Sie Einhorn verwenden.

Schau topauf deinem Server nach. Unicorn verbraucht derzeit wahrscheinlich 100% der CPU. Es gibt mehrere Gründe für dieses Problem.

  • Sie sollten Ihre HTTP-Anforderungen überprüfen, einige davon können sehr schwierig sein.

  • Überprüfen Sie die Version des Einhorns. Vielleicht haben Sie es kürzlich aktualisiert und etwas ist kaputt gegangen.

Pavel Kalashnikov
quelle
0

Im Server-Proxy so eingestellt

location / {

                proxy_pass http://ip:80;                

                proxy_connect_timeout   90;
                proxy_send_timeout      90;
                proxy_read_timeout      90;

            }

In Server PHP so eingestellt

server {
        client_body_timeout 120;
        location = /index.php {

                #include fastcgi.conf; //example
                #fastcgi_pass unix:/run/php/php7.3-fpm.sock;//example veriosn

                fastcgi_read_timeout 120s;
       }
}
Kamil Dąbrowski
quelle