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
OnDisconnectedAsyncdemora 90 segundos pra terminar, e oproxy_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_timeoutfor 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
| Diretiva | Sentido | Afeta | Função principal |
|---|---|---|---|
proxy_connect_timeout | Nginx → Servidor | Inicialização | Tempo máximo pra se conectar ao backend |
proxy_send_timeout | Nginx → Servidor | Upload / Request | Tempo máximo pra enviar request ao backend |
proxy_read_timeout | Servidor → Nginx | Resposta / WebSocket | Tempo máximo pra esperar resposta do backend |
send_timeout | Nginx → Cliente | Download | Tempo máximo pra enviar resposta ao cliente |
keepalive_timeout | Cliente ↔ Nginx | Conexão ociosa | Tempo de inatividade antes de fechar conexão |
client_body_timeout | Cliente → Nginx | Upload | Tempo 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.