Como evitar o tempo limite do primeiro byte com nginx

2

Eu tenho um aplicativo em RubyOnRails, intermediado por um servidor NGINX que está por trás de um serviço CDN. O CDN tem uma limitação que, se o primeiro byte de resposta não chegar em 60 segundos, o servidor CDN responde:

Error 503 first byte timeout

O problema é que tenho algumas solicitações que demoram mais de 60 segundos para serem processadas no lado do Rails. Existe uma maneira de hackear a resposta, enviando alguns bytes antes que a resposta termine seu processamento? Como?

Editar 1 :

Eu sei que anos 60 são muito tempo e estamos pensando em maneiras de evitar isso. Ainda assim, eu preciso de uma solução temporária que permita que os pedidos dos anos 60 funcionem. Mesmo se eu usar o Ajax, algumas chamadas ajax levariam mais de 60s e cairiam no mesmo problema. As opções tcp_nopush ou tcp_nodelay não funcionaram, acho que é porque o nginx está aguardando a resposta do aplicativo rails para saber quais cabeçalhos ele deve enviar. Então, talvez a solução seja algo que eu precise invadir dentro do ciclo de solicitação / resposta do RubyOnRails

    
por Daniel Cukier 04.09.2016 / 00:23

1 resposta

3

Uma solicitação que leva mais de 60 segundos é uma quantidade significativa de tempo. Você pode querer rever sua inscrição. Um tempo de carregamento de página que pode levar muitos visitantes a sair da sua aplicação. Você pode querer considerar o carregamento dos dados de forma assíncrona, como com AJAX ou websockets.

O tempo até o primeiro byte é geralmente aplicado aos cabeçalhos, não ao corpo da resposta. O cliente deve estar recebendo os cabeçalhos desde o início. Tem certeza de que é o seu CDN que atende aos pedidos? O NGinx também irá expirar seus pedidos. Uma boa maneira de verificar é com o curl:

curl -I -H "Host: <domain>" http://<ip of proxy>/request/uri 

(Use o IP real do seu proxy, não o IP do CDN)

A opção -I mostrará os cabeçalhos de resposta, assim você pode obter uma boa indicação de qual código de erro (se houver) está sendo retornado pelo nginx. Você também pode ver se está recebendo cabeçalhos de solicitação e quanto tempo demora, pois é a isso que tcp primeiro byte se refere.

Se você não estiver recebendo os cabeçalhos rapidamente, tente usar:

http {
tcp_nopush off; 
tcp_nodelay on; # force socket to send buffer
}

Se você estiver recebendo um erro de tempo limite do gateway ou algo semelhante, tente as seguintes opções de configuração:

http {
keepalive_timeout 300;
proxy_connect_timeout 300;
proxy_read_timeout    300;
proxy_send_timeout    300;
}
    
por 04.09.2016 / 01:50