¿Cómo deshabilitar el tiempo de espera para nginx?

47

En una máquina de desarrollo local, tengo un proxy inverso nginx como este:

server {
  listen 80;
  server_name myvirtualhost1.local;
  location / {
    proxy_pass http://127.0.0.1:8080;
}

server {
  listen 80;
  server_name myvirtualhost2.local;
  location / {
    proxy_pass http://127.0.0.1:9090;
}

Sin embargo, si depuro mi aplicación, la respuesta puede demorarse por un tiempo infinito, pero después de 30 segundos obtengo:

504 Gateway Time-out

como respuesta.

¿Cómo puedo desactivar el tiempo de espera y hacer que mi proxy inverso espere para siempre una respuesta? Y me gusta que la configuración sea global, de modo que no tenga que configurarla para cada proxy.

k0pernikus
fuente
1
Considere comenzar un trabajo en segundo plano y dejar que el usuario verifique su estado más adelante.
Michael Hampton

Respuestas:

61

Puede que no sea posible deshabilitarlo, pero una solución viable es aumentar el tiempo de ejecución. En un sitio tutorial de nginx , se escribió:

Si desea aumentar el límite de tiempo para todos los sitios en su servidor, puede editar el nginx.confarchivo principal :

vim /etc/nginx/nginx.conf

Agregue lo siguiente en la sección http {..}

http {
     fastcgi_read_timeout 300;
     proxy_read_timeout 300;
}

y vuelva a cargar la configuración de nginx:

sudo service nginx reload

He usado un valor bastante grande que es poco probable que suceda, es decir, 999999o que use unidades de tiempo , a un día a través de 1d.

Tenga en cuenta que establecer el valor en 0provocará un error de tiempo de espera de puerta de enlace inmediatamente.

k0pernikus
fuente
3
Estimado votante aleatorio, un comentario sobre lo malo de esta práctica sería bueno.
k0pernikus
77
@kb. Es curioso que soy el OP y acabo de publicar la solución más viable como respuesta, mientras espero una solución real ^^
k0pernikus
2
Jaja, extrañé por completo que eras OP. Pero su respuesta es la correcta, podría dejar aún más claro (para futuros googlers como yo) que no hay forma de desactivarlo. =)
kb.
55
¡Gracias por la información sobre 0no funcionar! Tenga en cuenta que puede especificar unidades de tiempo con sufijos legibles , por lo que podría usar un valor como 1d.
Nombre real redactado el
3
He agregado tanto eso como proxy_connect_timeout 600;al archivo nginx.conf, pero el tiempo de espera aún está en 60 segundos. ¿Algo más que deba probar?
andreszs
9

Si está utilizando AWS y Load Balancer, debe editar el tiempo de espera inactivo. Creo que el valor predeterminado es 60 segundos

szeljic
fuente
Entiendo por qué se rechazó esta votación, pero tal vez si la respuesta se actualizara para explicar su caso de uso, sería más útil. Aunque esto no responde al OP, es algo útil a tener en cuenta si está utilizando ELB, ya que también hay un límite en cuanto al tiempo que mantendrán una conexión abierta.
doz87
@ doz87 sí, es solo algo para considerar
szeljic
Vale la pena comprobar esto especialmente en mi caso de que trabajar con Magento bajo AWS. Buen punto @szeljic
vnpnlz
Gracias hermano, esto funciona para mí ya que uso el equilibrador de carga de AWS para distribuir a mi instancia EC2
Vũ Thành Tâm
Esto merece todos los votos a favor: cualquier usuario de AWS todavía estará limitado a 60 segundos, independientemente de su configuración NGINX sin esto
Aphire
4

He estado luchando con el error de tiempo de espera nginx 502 y no pude resolver el problema. Sin embargo, resultó ser gunicorn causando el error de tiempo de espera. Por lo tanto, es posible que también deba verificar la configuración de fastcgi.

Para gunicorn es:

gunicorn wsgi:application --timeout 300
Kostyantyn
fuente