Skip to main content

Time out | Nginx

  • Time out | Nginx

Fluxo simplificado

[Cliente] ⇄ [Nginx] ⇄ [Kestrel/.NET API] ⇄ [MongoDB]

Os timeouts do Nginx controlam quanto tempo ele espera por respostas do cliente e do servidor (Kestrel). Cada propriedade age em um ponto específico desse fluxo.


proxy_connect_timeout

Fase: Conexão TCP entre Nginx → backend (Kestrel) Momento: antes de enviar qualquer requisição HTTP

proxy_connect_timeout 10s;

Define quanto tempo o Nginx espera para conseguir se conectar ao servidor de destino. Se o Kestrel estiver offline, lento para aceitar conexões ou a porta errada for usada, isso dispara.

Analogia: “quanto tempo espero para conseguir falar com o servidor antes de desistir”.

Exemplo prático:

  • Se o Kestrel travar ou estiver em deploy, o Nginx aborta após 10 segundos com erro 504 (Gateway Timeout).

proxy_send_timeout

Fase: Nginx → Kestrel (envio da requisição) Momento: enquanto o Nginx envia dados para o backend

proxy_send_timeout 120s;

Define quanto tempo o Nginx espera para enviar o corpo completo da requisição ao backend. É raro expirar em APIs normais, mas pode acontecer com uploads grandes ou conexões lentas.

Analogia: “quanto tempo posso demorar para enviar o pedido ao servidor”.

Exemplo prático:

  • Se o cliente está mandando um arquivo gigante e o Nginx demora mais que 120s pra repassar tudo → timeout.

proxy_read_timeout

Fase: Kestrel → Nginx (resposta) Momento: enquanto o Nginx espera uma resposta do servidor

proxy_read_timeout 120s;

Define quanto tempo o Nginx espera para receber dados do backend depois que a requisição foi enviada.

Analogia: “quanto tempo espero pela resposta do servidor antes de achar que ele travou”.

Exemplo prático:

  • Se seu OnDisconnectedAsync demora 90 segundos pra terminar, e o proxy_read_timeout é 30s → Nginx fecha a conexão antes de o Kestrel responder → erro 104.

Dica: Esse é o timeout mais crítico para o SignalR e WebSockets.


send_timeout

Fase: Nginx → Cliente Momento: enquanto o Nginx envia a resposta para o cliente

send_timeout 120s;

Define quanto tempo o Nginx pode demorar para enviar a resposta completa ao cliente. Se o cliente estiver lento (rede ruim, websocket parado), e Nginx não conseguir enviar dentro desse tempo, ele fecha a conexão.

Analogia: “quanto tempo espero pra o cliente receber os dados antes de desistir”.

Exemplo prático:

  • Se o cliente estiver em rede 3G lenta, e o send_timeout for muito curto → desconexões prematuras.

keepalive_timeout

Fase: HTTP Keep-Alive (reutilização da conexão) Momento: entre uma requisição e outra, quando a conexão fica ociosa

keepalive_timeout 75s;

Controla por quanto tempo o Nginx mantém conexões TCP abertas (cliente ou backend) sem tráfego antes de fechá-las.

Analogia: “por quanto tempo deixo a linha aberta sem ninguém falar antes de desligar”.

Exemplo prático:

  • Se você usa SignalR Long Polling, e o cliente não manda nada por 75s, o Nginx pode cortar a conexão, forçando o reconnect.

client_body_timeout

Fase: Cliente → Nginx (upload do corpo da requisição) Momento: enquanto o Nginx espera o cliente enviar o corpo da requisição

client_body_timeout 60s;

Se o cliente começar um upload e parar no meio, o Nginx encerra após esse tempo.

Analogia: “quanto tempo espero o cliente terminar de falar”.


proxy_read_timeout em WebSocket (caso especial)

Quando você usa SignalR com WebSockets, o proxy_read_timeout se torna o tempo máximo de inatividade da conexão (sem mensagens).

Exemplo:

proxy_read_timeout 300s;

Se o cliente e servidor não trocarem nenhum dado por 5 minutos, o Nginx pode encerrar a sessão WebSocket.

Por isso o SignalR envia pings periódicos (KeepAliveInterval) — pra manter essa conexão viva.


Resumo rápido da utilidade de cada diretiva

DiretivaSentidoAfetaFunção principal
proxy_connect_timeoutNginx → ServidorInicializaçãoTempo máximo pra se conectar ao backend
proxy_send_timeoutNginx → ServidorUpload / RequestTempo máximo pra enviar request ao backend
proxy_read_timeoutServidor → NginxResposta / WebSocketTempo máximo pra esperar resposta do backend
send_timeoutNginx → ClienteDownloadTempo máximo pra enviar resposta ao cliente
keepalive_timeoutCliente ↔ NginxConexão ociosaTempo de inatividade antes de fechar conexão
client_body_timeoutCliente → NginxUploadTempo máximo pra cliente enviar corpo

Dica final para SignalR

Para conexões WebSocket ou longas:

proxy_connect_timeout 10s;
proxy_send_timeout 120s;
proxy_read_timeout 300s; # manter o socket vivo
send_timeout 120s;
keepalive_timeout 75s;

E no seu servidor .NET (SignalR):

services.AddSignalR(options =>
{
options.KeepAliveInterval = TimeSpan.FromSeconds(15);
options.ClientTimeoutInterval = TimeSpan.FromSeconds(60);
});

Assim, os pings do SignalR evitam que o Nginx considere a conexão “ociosa” e a feche à toa.