4xx Client error · RFC 9110 §15.5.9

408 Request Timeout

The client took too long to send the request.

What 408 means

The server opened the connection and waited for a complete request that never arrived, then gave up. It is about the client side of the exchange; slow servers produce 504 or 503, not 408.

Browsers open speculative connections they may never use, so a few 408s in server logs are normal background noise.

Common causes

  • Very slow or stalled upload from the client.
  • Idle keep-alive connections closed by the server (nginx client_header_timeout, client_body_timeout).
  • Mobile clients losing connectivity mid-request.

How to fix it

  • Raise the client body timeout for upload endpoints.
  • Clients should retry idempotent requests on 408; it is safe by definition.

What it looks like

A typical response:

HTTP/1.1 408 Request Timeout
Connection: close

The same event in an nginx access log (the status is the number after the request line):

203.0.113.7 - - [10/Sep/2026:10:12:01 +0000] "GET /api/orders HTTP/1.1" 408 153 "-" "Mozilla/5.0"

Check it with curl

-i prints the status line and headers, and -w '%{http_code}' prints only the number, which is handy in scripts and health checks. Replace the URL with yours:

curl -sS -o /dev/null -w '%{http_code} %{time_total}s\n' https://example.com/api/orders

Compare what curl sees with what the browser sees. A different status from the same URL usually means a cache, a CDN edge or a cookie is in the way.

Investigating a run of 408s? Paste the log excerpt into Log Share to get line numbers, highlighting and an expiring link for whoever is on call with you.

  • 504Gateway Timeout: A proxy or load balancer gave up waiting for the upstream server.
  • 499nginx-specific: the client closed the connection before the response.
  • 503Service Unavailable: The server is temporarily unable to handle the request.

FAQ

What is status 499 in nginx logs?

A non-standard nginx code meaning the client closed the connection before the server responded, often a browser navigating away or a client-side timeout shorter than the server's processing time.