¿Cómo resolver el error de tiempo de espera de trabajador crítico de gunicorn?

26

He usado nginx y gunicorn para alojar mi sitio web en dos servidores,

Ambos servidores tienen las mismas versiones de paquetes y el sitio web está alojado correctamente,

Pero en uno de mis servidores, gunicorn siempre tiene tiempo de espera y recibo un error

[CRITICAL]Worker Timeout
Booting worker with pid
Worker cannot boot with pid

Y después de esto recibo el error 502 Badgateway en la página web. Tengo que reiniciar el proceso de gunicorn para abrir el sitio web.

El siguiente es el registro de errores:

2014-02-16 14:29:53 [1267] [CRITICAL] WORKER TIMEOUT (pid:4994)
2014-02-16 14:29:53 [1267] [CRITICAL] WORKER TIMEOUT (pid:4994)   
2014-02-16 14:29:53 [22140] [INFO] Booting worker with pid: 22140

Y me sale un error continuo como este,

2014-02-16 14:29:53 [22140] [DEBUG] Ignoring EPIPE
Ignoring EPIPE
2014-02-16 14:29:53 [22140] [DEBUG] Ignoring EPIPE
Ignoring EPIPE
2014-02-16 14:29:57 [22140] [DEBUG] Ignoring EPIPE
Ignoring EPIPE

Y el trabajador comienza de nuevo,

2014-02-16 14:32:44 [1267] [CRITICAL] WORKER TIMEOUT (pid:4993)
2014-02-16 14:32:44 [1267] [CRITICAL] WORKER TIMEOUT (pid:4993)
2014-02-16 14:32:44 [22276] [INFO] Booting worker with pid: 22276

Ignorando nuevamente el error EPIPE y esto continúa hasta que reinicie el gunicorn. Y cuando recibo este error, obtengo un error de puerta de enlace 504 de nginx

sm
fuente
1
¿Pueden proporcionar más información, por favor? La línea de comandos que está utilizando para iniciar Gunicorn sería un buen comienzo.
supervacuo
Rastree al trabajador para ver dónde se está atascando:strace -p <PID> -e trace=network -t
Aryeh Leib Taurog
¿Cuál es la aplicación que estás ejecutando? Es posible que desee aumentar el tiempo de espera predeterminado.
Burhan Khalid
Sí, Burhan Khalid, por ahora he aumentado proxy_read_timeout a 1200 en nginx y el tiempo de espera a 3600 en configuración gunicorn. Espero que esto funcione
sm
@sm: ¿funcionó?
iamkhush

Respuestas:

29

Para solucionar este problema, aumente el indicador de tiempo de espera en Nginx,

En Nginx aumenta proxy_connect_timeouty proxy_read_timeout, puede agregar lo siguiente en el archivo nginx.conf bajo la httpdirectiva. Por defecto son 60.

proxy_connect_timeout 300s;

proxy_read_timeout 300s;

Reinicie el servidor Nginx. Consulte los documentos de nginx sobre los tiempos de espera .

Si la corrección anterior no funciona, aumente el indicador de tiempo de espera de Gunicorn en la configuración de Gunicorn, el tiempo de espera predeterminado de Gunicorn es de 30 segundos.

- timeout 90

Documentación de Gunicorn sobre el tiempo de espera

-t INT, - timeout INT 30 Los trabajadores en silencio durante más de estos segundos son asesinados y reiniciados.

Generalmente establecido en treinta segundos. Solo configure esto notablemente más alto si está seguro de las repercusiones para los trabajadores de sincronización. Para los trabajadores no sincronizados, solo significa que el proceso de trabajo aún se está comunicando y no está vinculado al tiempo requerido para manejar una sola solicitud.

Documentos de Gunicorn sobre los tiempos de espera de los trabajadores

Espero que esto lo resuelva.

sreekanth
fuente
2
Esta solución me salvó la vida después de estar buscando una solución todo el día. Si realmente tiene un proceso que dura más de 30 segundos (que era mi problema), entonces esta es definitivamente la solución correcta.
Alex P. Miller
Sí, incluso tenemos un escenario que dura más de 30 segundos, por lo tanto, adoptamos la solución. Agradable que ayudó.
sreekanth
No tenemos tal escenario. Hay un tráfico mínimo en el sitio, pero los trabajadores tienen un tiempo de espera cada día casi al mismo tiempo. Luego se pone en marcha después de 1-2 minutos. Mi configuración es nginx - supervisor - gunicorn - django. Tengo un tiempo de espera de 120 segundos.
iamkhush
proxy_connect_timeout: "Define un tiempo de espera para establecer una conexión con un servidor proxy. Cabe señalar que este tiempo de espera no puede exceder los 75 segundos ".
deweydb
@iamkhush ¿pudiste encontrar la solución para esto? También estoy enfrentando este problema incluso cuando mi aplicación está inactiva. Los trabajadores de Gunicorn tienen un tiempo de espera diario y ninguna de las soluciones como aumentar el tiempo de espera parece funcionar.
Ankit Jaiswal