504 Gateway Timeout
A proxy or gateway server (Nginx, CDN, load balancer) is waiting for a response from the upstream server and has given up after the timeout period. The upstream server might be alive but too slow to respond in time. Different from 502: 502 is "got bad data," 504 is "got nothing."
What can I do?
- The website's server is taking too long to respond. Try refreshing. If it persists, the site may be overloaded.
How to debug & fix
- Identify the slow query or operation with APM (New Relic, Datadog, py-spy)
- Increase proxy timeout if the operation is legitimately slow: proxy_read_timeout 120s
- Add database query timeouts and fast-fail when the DB is slow
- Implement async processing for long operations — return 202 and let the client poll
- Identify slow queries with APM profiling before simply raising the proxy timeout.
- Implement async processing (queue + 202) for legitimately long operations instead of raising timeouts arbitrarily.
Code Example
// Nginx: increase upstream timeout
// proxy_read_timeout 300;
// Express: set per-route timeout
const timeout = require('connect-timeout');
app.use('/api/reports', timeout('30s'));
app.use((req, res, next) => {
if (!req.timedout) next();
});
Related Status Codes
How HTTP Status Codes Work
Every HTTP response carries a three-digit status code that tells the client — browser, API consumer, or search-engine crawler — exactly what happened. The first digit defines the class: 1xx informational (request in progress), 2xx success, 3xx redirection, 4xx client error (bad request, missing auth, not found), and 5xx server failure.
Status codes are standardised in RFC 9110 (HTTP Semantics, 2022). Extensions like WebDAV (RFC 4918) and rate-limit headers (RFC 6585) added codes beyond the core set. When a client receives an unrecognised code, the rule is to treat it as the generic x00 of its class.
Why the Right Code Matters
Semantically correct codes help search engines index accurately (301 passes link equity; 410 removes pages faster than 404), allow API clients to implement correct retry logic (429 + Retry-After, 503 + Retry-After), and let monitoring systems distinguish bugs (500) from load issues (503) from auth failures (401/403).
Looking up a different status code? The full reference covers all HTTP codes with causes, fix guides, and copyable code examples for Node.js and Python.
Browse the full HTTP Status Code reference →