Solicitudes de larga duración con gunicorn + nginx

8

He reunido un servidor de integración para nuestra aplicación con tecnología Django. Algunas de las características aún son experimentales y resultan en solicitudes demasiado largas.

Estoy de acuerdo con el bajo rendimiento, por ahora, pero necesito poder integrarme. Cada vez que usamos la función que lleva a una solicitud larga, la aplicación se cuelga (como se esperaba) y luego, después de quizás un minuto y medio, devuelve un '502 - Bad Gateway'. El resto de la aplicación funciona bien.

Revisé el registro de gunicorn, y cada vez que esto sucede, recibo una línea como

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

sin embargo, esto sucede mucho antes del tiempo de espera real del trabajador, que configuré en 10 minutos solo para asegurarme. Aquí hay parte del script de inicio que ejecuta gunicorn.

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

Estoy ejecutando gunicorn versión 0.13.4. Cualquier ayuda sería muy apreciada.

Matt Luongo
fuente

Respuestas:

5

502 Bad Gatewaysignifica que tu trabajador de gunicorn es tiempo de espera. Puede agregar una --timeoutopción al gnuicorncomando. El valor predeterminado es 30 s.

Como señala @ greg-k, la proxy_read_timeoutopción de Nginx controla otro tiempo de espera. Si ve un 504 Gateway Timeouterror, puede ajustar esta opción.

Monitor de pescado
fuente
Ha pasado un tiempo desde que me preocupé por esto, pero ¿no es lo mismo en la -topción que ya tenía en la pregunta?
Matt Luongo
3

Este es quizás un problema con su configuración nginx. ¿Configuraste el valor proxy_read_timeout?

Esta directiva establece el tiempo de espera de lectura para la respuesta del servidor proxy. Determina cuánto tiempo esperará nginx para obtener la respuesta a una solicitud. El tiempo de espera se establece no para la respuesta completa, sino solo entre dos operaciones de lectura.

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

Greg K
fuente
Me acabo de mudar a un servidor más grande / más rápido para el desarrollo ($$ :(), pero si esto vuelve a aparecer, ¡probaré tu sugerencia!
Matt Luongo