it-swarm.com.de

Nginx Reverse Proxy verursacht 504 Gateway Timeout

Ich verwende Nginx als Reverse-Proxy, der Anforderungen entgegennimmt und dann einen Proxy-Pass ausführt, um die eigentliche Webanwendung vom Upstream-Server auf Port 8001 abzurufen.

Wenn ich zu mywebsite.com gehe oder ein Wget durchführe, bekomme ich nach 60 Sekunden ein 504 Gateway Timeout ... Wenn ich jedoch mywebsite.com:8001 lade, wird die Anwendung wie erwartet geladen!

Etwas hindert also Nginx daran, mit dem Upstream-Server zu kommunizieren.

Alles begann, nachdem meine Hostingfirma die Maschine zurückgesetzt hatte, auf der meine Sachen laufen, davor keine Probleme.

Hier ist mein vhosts-Serverblock:

server {
    listen   80;
    server_name mywebsite.com;

    root /home/user/public_html/mywebsite.com/public;

    access_log /home/user/public_html/mywebsite.com/log/access.log upstreamlog;
    error_log /home/user/public_html/mywebsite.com/log/error.log;

    location / {
        proxy_pass http://xxx.xxx.xxx.xxx:8001;
        proxy_redirect off;
        proxy_set_header Host $Host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
} 

Und die Ausgabe aus meinem Nginx-Fehlerprotokoll:

2014/06/27 13:10:58 [error] 31406#0: *1 upstream timed out (110: Connection timed out) while connecting to upstream, client: xxx.xx.xxx.xxx, server: mywebsite.com, request: "GET / HTTP/1.1", upstream: "http://xxx.xxx.xxx.xxx:8001/", Host: "mywebsite.com"
73
Dave Roma

Kann wahrscheinlich ein paar Zeilen hinzufügen, um den Timeout-Zeitraum auf den Upstream zu erhöhen. In den folgenden Beispielen wird das Timeout auf 300 Sekunden festgelegt:

proxy_connect_timeout       300;
proxy_send_timeout          300;
proxy_read_timeout          300;
send_timeout                300;
118
user2540984

Das Erhöhen der Zeitüberschreitung wird Ihr Problem wahrscheinlich nicht lösen, da, wie Sie sagen, der eigentliche Ziel-Webserver einwandfrei reagiert.

Ich hatte das gleiche Problem und fand heraus, dass die Verbindung nicht mit Keep-Alive belegt wurde. Ich kann nicht beantworten, warum dies so ist, aber als ich den Verbindungsheader löschte, habe ich dieses Problem gelöst und die Anfrage wurde gut weitergeleitet:

server {
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_Host;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_pass http://localhost:5000;
    }
}

Werfen Sie einen Blick auf diese Beiträge, um es genauer zu erläutern: nginx Schließen Sie die Upstream-Verbindung nach AnforderungKeep-Alive-Header-Erläuterunghttp://nginx.org /de/docs/http/ngx_http_upstream_module.html#keepalive

41
Almund

Wenn Sie das Zeitlimit für alle Websites erhöhen oder hinzufügen möchten, können Sie der nginx.conf-Datei unten stehende Zeilen hinzufügen.

Fügen Sie dem Abschnitt http der Datei /usr/local/etc/nginx/nginx.conf oder /etc/nginx/nginx.conf folgende Zeilen hinzu.

fastcgi_read_timeout 600;
proxy_read_timeout 600;

Wenn die obigen Zeilen nicht in der Datei conf vorhanden sind, fügen Sie sie hinzu. Andernfalls erhöhen Sie fastcgi_read_timeout und proxy_read_timeout, um sicherzustellen, dass nginx und php-fpm kein Timeout haben.

Um das Zeitlimit für nur eine Site zu erhöhen, können Sie in vim /etc/nginx/sites-available/example.com bearbeiten.

location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
        fastcgi_pass  unix:/var/run/php5-fpm.sock;
    fastcgi_read_timeout 300; 
}

und nachdem Sie diese Zeilen in nginx.conf hinzugefügt haben, vergessen Sie nicht, nginx neu zu starten.

service php7-fpm reload 
service nginx reload

wenn Sie Valet verwenden, geben Sie einfach valet restart ein.

8
Adeel

Sie können sich auch dieser Situation stellen, wenn Ihr Upstream-Server einen Domänennamen verwendet und seine IP-Adresse geändert wird (z. B. Ihr Upstream verweist auf eine AWS Elastic Load Balancer).

Das Problem ist, dass nginx die IP-Adresse einmal auflöst und für nachfolgende Anforderungen im Cache gespeichert bleibt, bis die Konfiguration neu geladen wird.

Sie können nginx anweisen, einen Nameserver für erneutes Auflösen der Domäne zu verwenden, sobald der zwischengespeicherte -Eintrag abläuft:

location /mylocation {
    # use google dns to resolve Host after IP cached expires
    resolver 8.8.8.8;
    set $upstream_endpoint http://your.backend.server/;
    proxy_pass $upstream_endpoint;
}

Die Dokumente auf proxy_pass erklären, warum dieser Trick funktioniert:

Der Parameterwert kann Variablen enthalten. In diesem Fall, wenn eine Adresse angegeben ist Als Domänenname wird der Name unter den beschriebenen Servergruppen gesucht und Wird er nicht gefunden, wird er mit einem Resolver ermittelt.

Ein Kudos an "Nginx mit dynamischen Upstreams" (tenzer.dk) für die ausführliche Erklärung, die auch einige relevante Informationen zu einer Einschränkung dieses Ansatzes bezüglich weitergeleiteter URIs enthält.

2
el.atomo

Hatte das gleiche Problem. Es stellte sich heraus, dass dies durch iptables Connection Tracking auf dem Upstream-Server verursacht wurde. Nachdem --state NEW,ESTABLISHED,RELATED aus dem Firewall-Skript entfernt und mit conntrack -F geleert wurde, war das Problem behoben. 

2
mindlab

user2540984 sowie viele andere haben darauf hingewiesen, dass Sie versuchen können, die Timeout-Einstellungen zu erhöhen. Ich selbst hatte ein ähnliches Problem wie dieses und versuchte, meine Timeout-Einstellungen in der Datei /etc/nginx/nginx.conf zu ändern, wie fast jeder in diesen Threads vermuten lässt. Dies half mir jedoch nicht ein bisschen; Es gab keine offensichtlichen Änderungen in den Timeout-Einstellungen von NGINX. Nach vielen Stunden der Suche gelang es mir schließlich, mein Problem zu lösen.

Die Lösung liegt in diesem Forumsthread , und es heißt, Sie sollten Ihre Timeout-Einstellungen in /etc/nginx/conf.d/timeout.conf (und if.) Eingeben Diese Datei existiert nicht, Sie sollten sie erstellen. Ich habe die gleichen Einstellungen verwendet wie im Thread vorgeschlagen:

proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;

Dies ist möglicherweise nicht die Lösung für Ihr spezielles Problem, aber wenn jemand anderes feststellt, dass sich das Timeout in /etc/nginx/nginx.confändert, tun Sie nichts, ich hoffe, diese Antwort hilft!

1