Código de status HTTP · Erros do cliente (4xx)
Erro 408 Request Timeout
O erro 408 Request Timeout significa que o servidor não recebeu o pedido completo dentro do tempo que estava disposto a esperar e desistiu. A lentidão é do lado de quem envia: upload lento ou travado, conexão instável, ou conexão aberta e deixada parada.
| Classe | 4xx, Erros do cliente |
|---|---|
| Definido em | RFC 9110 §15.5.9 |
| Pode ir para o cache por padrão | Só com Cache-Control ou Expires explícitos |
| Pode repetir o pedido | Sim, o cliente pode reenviar o pedido, numa conexão nova se preciso |
| Cabeçalhos relevantes |
|
O que significa o 408
A RFC 9110, seção 15.5.9, define o 408 como o servidor não receber a mensagem completa a tempo. Ela permite explicitamente que o cliente repita o pedido que estava a caminho, numa conexão nova se a atual não servir mais. Isso faz do 408 um dos poucos códigos 4xx em que repetir o mesmo pedido é o esperado.
Não confunda com aplicação lenta. Se o pedido chegou e o seu código demorou demais, isso é um 504 de um gateway ou um timeout do cliente, não um 408. O Node.js envia 408 sozinho quando um pedido passa do server.requestTimeout (300 segundos por padrão) ou os cabeçalhos passam do headersTimeout, e o nginx encerra pedidos com 408 quando o client_header_timeout ou o client_body_timeout vencem (60 segundos cada, por padrão).
Alguns 408 nos logs são inofensivos: navegadores abrem conexões extras com antecedência para acelerar a próxima navegação, e quando nenhum pedido chega, alguns servidores registram a conexão ociosa como 408.
Causas comuns
Se você está visitando o site
- Conexão lenta, instável ou congestionada (dados móveis, Wi-Fi sobrecarregado) ao enviar um formulário ou arquivo.
- O computador entrou em suspensão ou a rede mudou no meio de um upload.
Se você administra o servidor
- Timeouts de corpo ou cabeçalho curtos demais para uploads grandes em conexões lentas.
- Um cliente que declara Content-Length maior que o corpo realmente enviado, e o servidor fica esperando bytes que nunca chegam.
- Conexões especulativas ou keep-alive que ficam abertas sem pedido e batem no timeout do servidor.
Como resolver
Se você está visitando o site
- Recarregue e envie de novo, de preferência numa conexão mais estável.
- Para arquivos grandes, tente pelo Wi-Fi ou comprima o arquivo antes.
Se você administra o servidor
- Aumente o client_body_timeout do nginx ou o requestTimeout do Node em endpoints de upload, ou envie os arquivos direto ao storage com URLs pré-assinadas.
- Faça os clientes repetirem pedidos idempotentes ao receber 408, numa conexão nova; muitas bibliotecas HTTP já fazem isso.
- Confira se o Content-Length enviado pelo cliente bate com o corpo, principalmente quando um proxy reescreve ou comprime o conteúdo.
- Ignore entradas 408 no log sem linha de pedido; são pré-conexões ociosas, não usuários com erro.
Como enviar um 408
Quase ninguém escreve um 408 à mão: o servidor HTTP envia quando os timeouts de leitura vencem, então o que se configura são esses timeouts.
const server = app.listen(3000);
// Node answers 408 itself when these expire
server.headersTimeout = 10_000; // headers must arrive within 10 s
server.requestTimeout = 60_000; // whole request within 60 sserver {
# nginx ends the request with 408 when these expire
client_header_timeout 10s;
client_body_timeout 60s;
}Costuma ser confundido com
- 408 vs 504
- O 504 indica que um gateway esperou demais pelo servidor de trás; o 408 indica que o servidor esperou demais pelo cliente.
- 408 vs 499
- O 499 é o nginx registrando que o cliente desistiu primeiro; o 408 é o servidor desistindo do cliente.
- 408 vs 524
- O 524 é a Cloudflare esgotando o tempo esperando a resposta da origem, a direção oposta à do 408.
Perguntas frequentes
- O erro 408 é causado pelo cliente ou pelo servidor?
- O servidor informa que o cliente foi lento demais para enviar o pedido. A correção é uma conexão melhor, um conteúdo menor, ou timeouts maiores no servidor para uploads lentos legítimos.
- Posso repetir o pedido depois de um 408?
- Pode. A RFC 9110 permite que o cliente repita o pedido, numa conexão nova se a antiga foi fechada. Em pedidos não idempotentes, como pagamentos, garanta que o servidor ainda não processou, por exemplo com uma chave de idempotência.
- Por que aparecem tantos 408 no meu log de acesso?
- Muitas vezes vêm de conexões que o navegador abre com antecedência e nunca usa. Quando o servidor encerra uma conexão ociosa que não trouxe pedido, alguns servidores registram como 408. Isso não afeta os usuários.
Revisado em por Arielton Oberek.