Ich versuche, meine Django-Anwendung mit Nginx + uwsgi auszuführen, erhalte aber 504 Gateway Time-out
nach 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_pass
der 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.conf
fü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.conf
Installation 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.