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.
Related status codes
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.