¿Cómo evito un tiempo de espera de puerta de enlace con FastCGI en Nginx?

203

Estoy ejecutando Django, FastCGI y Nginx. Estoy creando una especie de API para que alguien pueda enviar algunos datos a través de XML que procesaré y luego devolver algunos códigos de estado para cada nodo que se envió.

El problema es que Nginx arrojará un tiempo de espera de la puerta de enlace 504 si me tomo demasiado tiempo para procesar el XML, creo que más de 60 segundos.

Por lo tanto, me gustaría configurar Nginx para que, si alguna solicitud que coincida con la ubicación / api, no expire durante 120 segundos. Qué configuración logrará eso.

Lo que tengo hasta ahora es:

    # Handles all api calls
    location ^~ /api/ {
        proxy_read_timeout 120;
        proxy_connect_timeout 120;
        fastcgi_pass 127.0.0.1:8080;
    }

Editar: lo que tengo no funciona :)

fundas
fuente
77
Puede establecer valores de tiempo de espera en "2m" en lugar de "120".
Cenk Alti
1
Parece malo que los datos no se transmitan ... es decir, que un servidor comience a responder en 60 segundos o más parece inaceptable.
Adam Gent

Respuestas:

245

Los tiempos de espera de proxy son buenos, para servidores proxy, no para FastCGI ...

Las directivas que afectan los tiempos de espera de FastCGI son client_header_timeout, client_body_timeouty send_timeout.

Editar : Teniendo en cuenta lo que se encuentra en nginx wiki, la directiva send_timeout es responsable de establecer el tiempo de espera general de respuesta (que fue un poco engañoso). Para FastCGI, fastcgi_read_timeoutesto está afectando el tiempo de espera de respuesta del proceso fastcgi .

HTH

zgoda
fuente
8
Para cualquiera que use uwsgi y tenga este error, uwsgi_read_timeout 600; arreglaron mi problema
Homer6
2
Mi pregunta aquí sería (como servidor administrador aficionado) ¿a dónde voy para cambiar esto? archivo httpd.conf?
jeffkee
2
Si ayuda, el mío estaba en / etc / nginx / en el sistema DV de Media Temple.
jeffkee
Abdo da una buena manera de depurar. Si aún tiene problemas, es posible que deba aumentar el tamaño máximo de mensaje del cliente en nginx.conf (client_max_body_size ** M;)
Sam Grondahl
2
Aumentar el tiempo de espera en mi humilde opinión no es una solución adecuada.
JazzCat
24

Para aquellos que usan nginx con unicornio y rieles, lo más probable es que el tiempo de espera esté en su unicorn.rbarchivo

poner un gran tiempo de espera en unicorn.rb

timeout 500

si aún enfrenta problemas, intente tener fail_timeout = 0 en su upstream en nginx y vea si esto soluciona su problema. Esto es para fines de depuración y puede ser peligroso en un entorno de producción.

upstream foo_server {
        server 127.0.0.1:3000 fail_timeout=0;
}
Abdo
fuente
3
Creo que la gente lo rechazó porque se trata de Django, sin embargo, su respuesta solucionó mi problema de tiempo de espera de puerta de enlace con Rails + Unicorn :)
ZiggyTheHamster
4

En la httpsección nginx (/etc/nginx/nginx.conf) agregue o modifique:

keepalive_timeout 300s

En la serversección nginx (/etc/nginx/sites-available/your-config-file.com) agregue estas líneas:

client_max_body_size 50M;
fastcgi_buffers 8 1600k;
fastcgi_buffer_size 3200k;
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;

En el phparchivo en el caso 127.0.0.1:9000 (/etc/php/7.X/fpm/pool.d/www.conf) modifique:

request_terminate_timeout = 300

Espero ayudarte

José Carlos Ramos Carmenates
fuente
¿Pasaría algo "malo" si cambio el tiempo a 10000 segundos?
utdev
No pasa nada malo, pero su servicio espera más tiempo. Puede cambiar su valor como desee.
Jose Carlos Ramos Carmenates
1

Si usas unicornio.

Mira en toptu servidor. Es probable que Unicorn esté usando el 100% de la CPU en este momento. Hay varias razones de este problema.

  • Debe verificar sus solicitudes HTTP, algunas de ellas pueden ser muy difíciles.

  • Verifique la versión del unicornio. Puede ser que lo hayas actualizado recientemente y se haya roto algo.

Pavel Kalashnikov
fuente
0

En el servidor proxy configurado así

location / {

                proxy_pass http://ip:80;                

                proxy_connect_timeout   90;
                proxy_send_timeout      90;
                proxy_read_timeout      90;

            }

En el servidor php configurado así

server {
        client_body_timeout 120;
        location = /index.php {

                #include fastcgi.conf; //example
                #fastcgi_pass unix:/run/php/php7.3-fpm.sock;//example veriosn

                fastcgi_read_timeout 120s;
       }
}
Kamil Dąbrowski
fuente