Como impedir um tempo limite de gateway com FastCGI no Nginx


203

Estou executando o Django, FastCGI e Nginx. Estou criando um tipo de API que permite que alguém envie alguns dados via XML que processarei e retornarei alguns códigos de status para cada nó que foi enviado.

O problema é que o Nginx lançará um tempo limite do gateway 504 se eu demorar muito para processar o XML - acho que mais de 60 segundos.

Então, eu gostaria de configurar o Nginx para que, se alguma solicitação correspondente à localização / API não exceder o tempo limite por 120 segundos. Que configuração conseguirá isso.

O que tenho até agora é:

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

Edit: O que eu tenho não está funcionando :)


7
Você pode definir valores de tempo limite para "2m" em vez de "120".
Cenk Alti

1
Parece ruim que os dados não estejam sendo transmitidos ... ou seja, para um servidor começar a responder em 60 segundos ou mais, parece inaceitável.
Adam Gent

Respostas:


245

Os tempos limite do proxy são bons, para proxies, não para FastCGI ...

As diretivas que afetam os tempos limite do FastCGI são client_header_timeout, client_body_timeoute send_timeout.

Edit : Considerando o que é encontrado no wiki do nginx, a diretiva send_timeout é responsável por definir o tempo limite geral da resposta (o que foi um pouco enganador). Para o FastCGI, fastcgi_read_timeoutestá afetando o tempo limite da resposta do processo fastcgi .

HTH.


8
Para quem usa uwsgi e está com esse erro, uwsgi_read_timeout 600; corrigiu meu problema.
Homer6

2
Minha pergunta aqui seria (como um administrador de servidor amador) onde devo mudar isso? arquivo httpd.conf?
jeffkee

2
Se ajudar, o meu estava em / etc / nginx / no sistema de DV do Media Temple.
jeffkee

Abdo oferece uma ótima maneira de depurar. Se você ainda tiver problemas, pode ser necessário aumentar o tamanho da mensagem cliente max em nginx.conf (client_max_body_size ** M;)
Sam Grondahl

2
Aumentar o tempo limite do imho não é uma solução adequada.
precisa saber é

24

Para aqueles que usam nginx com unicórnio e trilhos, provavelmente o tempo limite está no seu unicorn.rbarquivo

coloque um grande tempo limite no unicorn.rb

timeout 500

se você ainda estiver enfrentando problemas, tente ter fail_timeout = 0 no seu upstream no nginx e veja se isso resolve o seu problema. Isso é para fins de depuração e pode ser perigoso em um ambiente de produção.

upstream foo_server {
        server 127.0.0.1:3000 fail_timeout=0;
}

3
Eu acho que as pessoas downvoted porque trata-se de Django, no entanto a sua resposta fixa o meu problema de tempo limite gateway com Rails + Unicorn :)
ZiggyTheHamster

4

Na httpseção nginx (/etc/nginx/nginx.conf), adicione ou modifique:

keepalive_timeout 300s

Na serverseção nginx (/etc/nginx/sites-available/your-config-file.com), adicione estas linhas:

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;

No phparquivo no caso 127.0.0.1:9000 (/etc/php/7.X/fpm/pool.d/www.conf), modifique:

request_terminate_timeout = 300

Espero te ajudar.


Aconteceria algo "ruim" se eu alterasse o tempo para 10.000 segundos?
utdev

Não acontece nada de ruim, mas seu serviço aguarda mais tempo. Você pode alterá-lo conforme desejar.
Jose Carlos Ramos Carmenates

1

Se você usa unicórnio.

Veja no topseu servidor. O Unicorn provavelmente está usando 100% da CPU no momento. Existem várias razões para esse problema.

  • Você deve verificar suas solicitações HTTP, algumas delas podem ser muito difíceis.

  • Verifique a versão do unicórnio. Talvez você o tenha atualizado recentemente, e algo foi quebrado.


0

No servidor proxy definido assim

location / {

                proxy_pass http://ip:80;                

                proxy_connect_timeout   90;
                proxy_send_timeout      90;
                proxy_read_timeout      90;

            }

No servidor php definido assim

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;
       }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.