Browser showing a 408 Request Timeout HTTP error
# website errors# troubleshooting

408 Request Timeout: What It Means and How to Fix It

A 408 Request Timeout error means the server was ready to accept a request, but the client didn't send one in time. The server waited, ran out of patience, and closed the connection. Unlike a 504 Gateway Timeout where a proxy gives up waiting for a backend, a 408 is the server telling the client directly: "You took too long to talk to me."

This error is less common than other HTTP errors, but when it starts appearing in your logs it usually points to a network issue, a misconfigured timeout, or a client that's sending data too slowly.

What Does a 408 Request Timeout Mean?

When a client opens a TCP connection to a server, the server expects the client to send an HTTP request within a reasonable time. If the client connects but then goes silent — or sends data so slowly that the server's timeout expires — the server responds with a 408 and closes the connection.

The key difference between timeout errors:

  • 408 Request Timeout: The server waited for the client to send the request. The client was too slow.
  • 504 Gateway Timeout: A proxy waited for the backend server to respond. The backend was too slow.
  • 524 Cloudflare Timeout: Cloudflare waited for the origin server to respond.

A 408 points the finger at the client side of the connection, or at the server's timeout being set too aggressively.

Common Causes of a 408 Error

1. Client Network Issues

The most common cause. The client (browser, API consumer, mobile app) has a slow or unstable network connection. It opens the TCP connection but can't send the HTTP request headers or body fast enough before the server's timeout kicks in.

2. Server Timeout Set Too Low

If your server's client_header_timeout or client_body_timeout is set very low, legitimate clients on slower connections will get 408 errors. This is especially problematic for users uploading files or submitting large forms.

3. Large Request Bodies Sent Over Slow Connections

A client uploading a large file over a slow connection may trigger a 408 if the server expects the entire body within a fixed time window.

4. Keep-Alive Connection Timeout

Many 408 errors occur on keep-alive connections. When a client holds a persistent connection open but doesn't send a new request within the keep-alive timeout, the server may send a 408 before closing the connection. This is often harmless and expected behaviour.

5. Proxy or Load Balancer Interference

An intermediary (reverse proxy, load balancer, CDN) may be buffering the client's request and not forwarding it fast enough, causing the origin server to time out.

6. Antivirus or Firewall Slowing the Connection

Client-side security software can intercept and inspect outgoing requests, adding delay that causes the server to time out before the full request arrives.

How to Fix a 408 Request Timeout

Step 1: Increase Server Timeouts

If you're seeing 408s from legitimate users, your timeouts may be too aggressive.

On Nginx:

http {
    # Time to receive the request headers
    client_header_timeout 60s;

    # Time to receive the request body
    client_body_timeout 60s;

    # Keep-alive timeout
    keepalive_timeout 65s;

    # For large file uploads, also increase
    client_max_body_size 100M;
}
# Test and reload Nginx
sudo nginx -t && sudo systemctl reload nginx

On Apache:

# In httpd.conf or apache2.conf
Timeout 60
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

The RequestReadTimeout directive in Apache 2.4+ is especially useful — it sets a minimum data rate rather than a hard timeout, which accommodates slow but active connections while still dropping truly stalled ones.

# Enable the reqtimeout module if not already active
sudo a2enmod reqtimeout
sudo systemctl reload apache2

Step 2: Optimise Keep-Alive Settings

If most of your 408s are on idle keep-alive connections, this is normal behaviour. Adjust the keep-alive timeout to reduce unnecessary 408 responses:

# Nginx - reduce keep-alive timeout to reduce idle connections
keepalive_timeout 30s;

# Limit requests per keep-alive connection
keepalive_requests 100;

Step 3: Check for Slow Clients in Your Logs

Identify whether the 408s are coming from specific clients, IPs, or user agents:

# Find 408 errors in Nginx access logs
grep ' 408 ' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20

If they're mostly from bots or crawlers, this is normal and can be safely ignored. If they're from real users, investigate the network path.

Step 4: Handle File Uploads Properly

For endpoints that accept large file uploads, set generous body timeouts on those specific locations rather than globally:

location /upload {
    client_body_timeout 300s;
    client_max_body_size 500M;
    proxy_read_timeout 300s;
    proxy_pass http://localhost:3000;
}

Step 5: Client-Side Fixes

If you're the one receiving 408 errors from an API:

# Test with a longer timeout using curl
curl --connect-timeout 30 --max-time 120 https://api.example.com/endpoint

# Check if the issue is DNS resolution speed
time nslookup api.example.com
  • Check your network connection stability.
  • Ensure your HTTP client library has adequate timeout settings.
  • If uploading large payloads, consider chunked transfer encoding.

How Domain Monitor Can Help

A spike in 408 errors often indicates a deeper infrastructure problem — perhaps your server is under heavy load and can't accept new connections fast enough, or a network issue is affecting client connectivity. While individual 408s on keep-alive connections are harmless, a sudden increase can signal that real users are being timed out before they can even load your site.

Domain Monitor checks your site every minute from multiple global locations, simulating real user connections. If your server starts timing out connections, Domain Monitor will detect the failure and alert you via email, SMS, or Slack. You can set up downtime alerts to catch these problems early. Combined with website monitoring across multiple endpoints, you'll see whether timeout issues are isolated or site-wide.

Quick Summary

CauseFix
Client network too slowClient-side: check connection, retry
Server timeout too lowIncrease client_header_timeout / client_body_timeout
Large upload over slow connectionSet generous timeouts on upload endpoints
Idle keep-alive connectionsAdjust keepalive_timeout, usually harmless
Proxy buffering delaysCheck proxy/load balancer timeout settings

Most 408 errors in server logs are harmless keep-alive timeouts. But if real users or API consumers are hitting them, it's time to review your timeout configuration and network infrastructure.

More posts

Wildcard vs SAN vs Single-Domain SSL Certificates: Which Do You Need?

Wildcard, SAN (multi-domain), and single-domain SSL certificates cover different use cases. Here's a clear comparison to help you pick the right type — and avoid paying for coverage you don't need.

Read more
Why DNS Works in One Location but Fails in Another

DNS resolves correctly from your office but fails for users in other countries or on different ISPs. Here's why geographic DNS inconsistency happens and how to diagnose which layer is causing it.

Read more
Registrar Lock vs Transfer Lock: What's the Difference?

Registrar lock and transfer lock are often confused — and disabling the wrong one leaves your domain vulnerable. Here's a clear breakdown of what each does and when to use them.

Read more

Subscribe to our PRO plan.

Looking to monitor your website and domains? Join our platform and start today.