web-dev-qa-db-de.com

Nginx-Timeout, wenn uWSGI lange dauert, um die Anforderung zu verarbeiten

Ich habe Nginx + uWSGI für Python Django App. 

Ich habe folgendes in meinem nginx.conf:

location / {
    include uwsgi_params;
    uwsgi_pass   127.0.0.1:9001;
    uwsgi_read_timeout 1800;
    uwsgi_send_timeout 300;
    client_header_timeout 300;
    proxy_read_timeout 300;
    index  index.html index.htm;
}

bei lang laufenden Anfragen über uWSGI, die etwa 1 Minute dauern, erhalte ich einen Timeout-Fehler im Nginx-Fehlerprotokoll wie folgt:

2013/04/22 12:35:56 [Fehler] 2709 # 0: * 1 Zeitlimit für Upstream (110: Zeitüberschreitung der Verbindung) beim Lesen des Antwortheaders vom Upstream, Client: xx.xx.xx.xx, Server:, Anforderung : "GET/entity/datasenders/HTTP/1.1", Upstream: "uwsgi: //127.0.0.1: 9001", Host: "xxx.xx.xx.x"

Ich habe das Header-Timeout bereits festgelegt und das uWSGI-Senden/Lesen-Timeout auf 5 Minuten festgelegt. Kann mir jemand bitte sagen, was ich tun kann, um das zu überwinden?

35
anishek

Die Konfiguration, die das Problem löst, ist:

location / {
    include uwsgi_params;
    uwsgi_pass   127.0.0.1:9001;
    uwsgi_read_timeout 300;
    index  index.html index.htm;
}

Der Grund der obigen Konfiguration in der Frage funktionierte für uns nicht, da leider in unserem Rechner mehrere Pfade eine nginx.conf-Datei hatten. Wir haben mit dem Conf auf dem falschen Weg gearbeitet. 

So stellen Sie fest, welchen Pfad Ihr nginx die Konfiguration von run übernimmt: 

nginx -V  # V is caps

dieser wird einen --conf-path=[] haben, der Ihnen genau sagt, wo er die Konfiguration abruft.

Ich habe kürzlich den obigen nginx -V gefunden, um nicht die richtigen Informationen zu geben. Ich werde das Obige nur für den Fall verlassen, dass andere es nützlich finden.

59
anishek

Zusätzlich zur Antwort "uwsgi_read_timeout" sollten Sie auch prüfen, ob der Besitz für Ihr nginx uwsgi-Cache-Verzeichnis korrekt ist. Für das Eigentum muss derselbe Benutzer wie für den laufenden nginx-Prozess festgelegt sein. In meinem Fall musste ich dies tun

grep '^user' /etc/nginx/nginx.conf
ls -lah /var/cache/nginx/uwsgi_temp
for f in $( find /var/cache/nginx/uwsgi_temp ); do ls -lah $f; done

Besitzen diese Dateien den gleichen Benutzer? Andernfalls könnten Sie nginx herunterfahren und alle Cache-Dateien entfernen. Vergewissern Sie sich, dass der richtige Besitzer unter/var/cache/nginx/uwsgi_temp liegt, und starten Sie ihn erneut. Vielleicht könnten Sie auch nur einen rekursiven Chown machen, diesen Ansatz habe ich nicht getestet.

# store the user
THEUSER=$(grep '^user' /etc/nginx/nginx.conf | sed 's/.* //; s/;.*//' )

Cache entfernen und Ansatz neu starten

/etc/init.d/nginx stop
rm -rf /var/cache/nginx/uwsgi_temp/* 
chown $THEUSER:$THEUSER /var/cache/nginx/uwsgi_temp
/etc/init.d/nginx start

Rekursiver Chown-Ansatz

chown -R $THEUSER:$THEGROUP /var/cache/nginx/uwsgi_temp/
# not sure if you have to restart nginx here... 
0
rideswitch