Langfristige Anfragen mit Gunicorn + Nginx

8

Ich habe einen Integrationsserver für unsere Django-basierte Anwendung zusammengestellt. Einige der Funktionen sind noch experimentell und führen zu zu langen Anforderungen.

Ich bin mit der schlechten Leistung im Moment einverstanden, aber ich muss mich integrieren können. Immer wenn wir die Funktion verwenden, die zu einer langen Anfrage führt, hängt die App (wie erwartet) und gibt nach etwa anderthalb Minuten ein "502 - Bad Gateway" zurück. Der Rest der App funktioniert gut.

Ich habe das Gunicorn-Protokoll überprüft, und wann immer dies passiert, bekomme ich eine Zeile wie

2012-01-20 17:30:13 [23128] [DEBUG] GET /results/
2012-01-20 17:30:43 [23125] [ERROR] WORKER TIMEOUT (pid:23128)
Traceback (most recent call last):
  File "/home/demo/python_envs/frontend/lib/python2.6/site-packages/gunicorn/app/base.py", line 111, in run
    os.setpgrp()
OSError: [Errno 1] Operation not permitted

Dies geschieht jedoch lange vor dem tatsächlichen Workout-Timeout, das ich auf 10 Minuten eingestellt habe, um sicherzugehen. Hier ist ein Teil des Upstart-Skripts, mit dem Gunicorn ausgeführt wird.

description "..."

start on runlevel [2345]
stop on runlevel [!2345]
#Send KILL after 5 seconds
kill timeout 5
respawn

env VENV="/path/to/a/virtual/env/"

#how to know the pid
pid file $VENV/run/guniconr-8080.pid

script
exec sudo -u demo $VENV/bin/gunicorn_django --preload --daemon -w 4 -t 600 --log-level debug --log-file $VENV/run/gunicorn-8080.log -p $VENV/run/gunicorn-8080.pid -b localhost:8080 /path/to/settings.py
end script

Ich verwende Gunicorn Version 0.13.4. Jede Hilfe wäre sehr dankbar.

Matt Luongo
quelle

Antworten:

5

502 Bad Gatewaybedeutet, dass Ihr Gunicorn-Arbeiter eine Auszeit hat. Sie können --timeoutdem gnuicornBefehl eine Option hinzufügen . Der Standardwert ist 30s.

Wie @ greg-k feststellt, proxy_read_timeoutsteuert die Option von Nginx ein weiteres Timeout. Wenn Sie einen 504 Gateway TimeoutFehler sehen, können Sie diese Option anpassen.

Fischmonitor
quelle
Es ist schon eine Weile her, seit ich mir darüber Sorgen gemacht habe, aber - ist das nicht dasselbe bei der -tOption, die ich bereits in der Frage hatte?
Matt Luongo
3

Dies ist möglicherweise ein Problem mit Ihrer Nginx-Konfiguration. Haben Sie den Wert proxy_read_timeout konfiguriert?

Diese Anweisung legt das Lesezeitlimit für die Antwort des Proxyservers fest. Es bestimmt, wie lange nginx auf die Antwort auf eine Anfrage wartet. Das Zeitlimit wird nicht für die gesamte Antwort festgelegt, sondern nur zwischen zwei Lesevorgängen.

Quelle: http://wiki.nginx.org/HttpProxyModule#proxy_read_timeout

Greg K.
quelle
Ich bin gerade auf einen größeren / schnelleren Server für die Entwicklung umgezogen ($$ :(), aber wenn dies wieder auftaucht, werde ich Ihren Vorschlag testen!
Matt Luongo