504 Gateway-Timeout uwsgi + nginx django-Anwendung

504 Gateway-Timeout uwsgi + nginx django-Anwendung

Ich versuche, meine Django-Anwendung mit Nginx + uwsgi auszuführen, erhalte aber 504 Gateway Time-outnach einer Minute Ladezeit die Fehlermeldung.

Meine App braucht Zeit, um das Notwendige zu tun, da sie auf mehreren Websites nach bestimmten Dingen sucht.

Meine Nginx-Konfiguration ist die folgende:

upstream uwsgi {
    server 127.0.0.1:8000;
}

server {

    listen 80;
    server_name server_ip;

    root /opt/emails/subscriptions;
    index index.html index.htm index.php;

    location /emailsproject/ {
        root /opt/emails/subscriptions/;
    }

    location / {
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://uwsgi;
        proxy_set_header Host $http_host;
        uwsgi_read_timeout 18000;
    }
}

Mein uwsgi-Skript:

description "uWSGI server"

env PYTHONPATH=/opt/emails/subscriptions
env DJANGO_SETTINGS_MODULE=emailsproject.settings

start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec uwsgi_python --http-socket  127.0.0.1:8000 -p 4 --wsgi-file /opt/emails/subscriptions/emailsproject/wsgi.py

Mein Nginx gibt mir die folgende Fehlermeldung im error.log aus:

2015/09/28 02:15:57 [error] 4450#0: *19 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 37.235.53.246, server: my_server_ip, request: "POST /home/ HTTP/1.1", upstream: "http://127.0.0.1:8000/home/", host: "my_server_ip", referrer: "http://my_server_ip/home/"

Hat jemand eine Idee, wie ich das loswerden kann? Ich habe unzählige Stackoverflow-Lösungen ausprobiert, aber keine hat bei mir funktioniert.

Antwort1

Ich weiß, dass ich spät dran bin, aber nachdem ich viele dieser (und andere) Vorschläge ausprobiert hatte, stellte ich schließlich fest, dass das Timeout bei mir von meinem DNS herrührte. Wenn Sie Amazon-Load Balancer verwenden, ist dort ein „Leerlauf-Timeout“ standardmäßig auf 120 Sekunden eingestellt.

Antwort2

Das liegt daran, dass Sie festlegen müssen proxy_read_timeout, nicht uwsgi_read_timeout. Und das liegt wiederum daran, dass Sie tatsächlich nicht uwsgi verwenden, sondern HTTP-Proxying. Uwsgi-Backends werden mithilfe uwsgi_passder Direktive deklariert.

Antwort3

Viele Leute gehen davon aus, dass 504 mit einer Anfrage vom Client zusammenhängt oder wenn es vor Ort einen DDoS-Angriff mit einer großen Sitzungshäufung gibt. 504 funktioniert in beide Richtungen, da Sie den Fehler sehen können, wenn Ihr WSGI keinen Code darstellen kann und/oder wenn der Server aufgrund eines Überlaufs nicht antworten kann. Führen Sie also unbedingt manage.py aus, um zu überprüfen, ob Ihr Code darstellbar ist. Versuchen Sie dann "curl -I yoursite.com"den Befehl, um zu sehen, ob er immer noch einen Fehler ausgibt. Es gibt zwei nginx-bezogene Dateien, auf die Sie sich konzentrieren müssen. Eine davon ist /etc/nginx/nginx.conffür die globalen Standardeinstellungen. Die zweite ist die, die Sie selbst erstellen /etc/nginx/sites-available. Fügen Sie in Ihrer globalen /etc/nginx/nginx.confInstallation die folgenden Zeilen hinzu

proxy_connect_timeout   10;
proxy_send_timeout      15;
proxy_read_timeout      20;

Diese Lösung behebt 90 % der 504-Fehler, die in verschiedenen Szenarien auftreten. Ihre Projektkonfiguration sollte dieselbe sein wie oben angegeben.

verwandte Informationen