Como desativar o tempo limite para o nginx?

47

Em uma máquina de desenvolvimento local, tenho um proxy reverso nginx da seguinte forma:

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;
}

No entanto, se eu depurar meu aplicativo, a resposta poderá ser adiada por um período infinito de tempo, mas após 30 segundos eu recebo:

504 Gateway Time-out

como resposta.

Como posso desativar o tempo limite e fazer com que meu proxy reverso aguarde uma resposta para sempre? E eu gosto que a configuração seja global, para que eu não precise defini-la para cada proxy.

k0pernikus
fonte
1
Considere iniciar um trabalho em segundo plano e permitir que o usuário verifique seu status posteriormente.
Michael Hampton

Respostas:

61

Talvez não seja possível desativá-lo, mas uma solução possível é aumentar o tempo de execução. Em um site tutorial do nginx , foi escrito:

Se você deseja aumentar o prazo para todos os sites em seu servidor, você pode editar o nginx.confarquivo principal :

vim /etc/nginx/nginx.conf

Adicione o seguinte na seção http {..}

http {
     fastcgi_read_timeout 300;
     proxy_read_timeout 300;
}

e recarregue a configuração do nginx:

sudo service nginx reload

Eu usei um valor bastante grande que é improvável que aconteça, 999999ou seja, ou use unidades de tempo , para um dia via 1d.

Cuidado ao definir o valor como para 0causar um erro de tempo limite do gateway imediatamente.

k0pernikus
fonte
3
Caro downvoter aleatório, seria bom um comentário sobre o que é ruim nessa prática.
K0pernikus
7
@kb. É engraçado como que eu sou o OP e só postou a solução mais viável como uma resposta, enquanto espera por uma solução real ^^
k0pernikus
2
Haha, eu perdi completamente que você era OP. Mas sua resposta é a correta, você pode deixar ainda mais claro (para futuros googlers como eu) que não há como desativá-lo. =)
kb.
5
Obrigado pela informação sobre 0não funcionar! Observe que você pode especificar unidades de tempo com sufixos legíveis , para poder usar um valor como 1d.
Nome verdadeiro Editado
3
Eu adicionei isso e proxy_connect_timeout 600;ao arquivo nginx.conf, mas o tempo limite ainda está em 60 segundos. Mais alguma coisa que eu deveria tentar?
andreszs
9

Se você estiver usando o AWS e o Load Balancer, edite o tempo limite de inatividade. Eu acho que o padrão é 60 segundos

szeljic
fonte
Entendo por que isso foi recusado, mas talvez se a resposta fosse atualizada para explicar seu caso de uso, seria mais útil. Embora isso não atenda ao OP, é algo útil a considerar se você estiver usando o ELB, pois há um limite de quanto tempo eles manterão uma conexão aberta também.
Doz87 2/10
@ doz87 sim, é apenas algo a considerar
szeljic 2/18
Vale realmente a pena verificar, especialmente no meu caso, que trabalhar com Magento sob a AWS. Bom ponto @szeljic
vnpnlz
Graças bro, isso funciona para mim desde que eu uso AWS balanceador de carga para distribuir à minha instância EC2
Vũ Thành Tâm
Isso merece todos os votos positivos - todos os usuários da AWS ainda estarão limitados a 60 segundos, independentemente de suas configurações NGINX sem isso
Aphire
4

Eu estive lutando com o erro de tempo limite do nginx 502 e não consegui resolver o problema. No entanto, passou a ser gunicorn causando o erro de tempo limite. Então, você também pode precisar verificar as configurações do fastcgi.

Para gunicorn é:

gunicorn wsgi:application --timeout 300
Kostyantyn
fonte