503 Service Unavailable
The server is online but temporarily cannot handle your request, usually because it is overloaded, restarting, or down for maintenance. A 503 is almost always on the website's side, not your device or connection, and it is usually temporary.
Updated June 2026 · 5 min read
-
Written by
Andrian Valeanu
Founder of Pulsetic
Andrian Valeanu founded Pulsetic and, before it, Designmodo. Across 15-plus years he has shipped web products, design tools, and monitoring software teams around the world rely on.
-
Reviewed by
Ionut Caval
Technical reviewer
Ionut Caval reviews Pulsetic's technical guides for accuracy. He works hands-on with web servers, networking, and uptime monitoring day to day, and makes sure the causes and fixes here hold up in production.
The short version: A 503 Service Unavailable means the server is up but cannot take your request right now, typically because it is overloaded, restarting, or in maintenance. It is almost always temporary and on the website's side. Visitors should wait and reload. Owners should check server load, recent deploys, plugins, the CDN, and the logs.
Key takeaways
- A 503 means the server is reachable but will not handle your request just now. The usual reasons: overload, a restart, throttling, or maintenance. RFC 9110 frames it as a temporary overload or scheduled downtime.
- A 502 or 504 is a broken or missing reply. A 503 is the server answering correctly that it will not serve you yet, which makes it deliberate or self-aware rather than a fault.
- A healthy 503 carries a Retry-After header. This is the SEO-safe way to be down, because Google reads 503 as temporary and comes back later instead of dropping the page the way a 200 error or 404 can.
- A 503 from a CDN like Cloudflare almost always means no healthy origin passed the health check, not that Cloudflare broke. Bypass the edge and hit the origin to tell the two apart.
- On the owner side the usual suspects are an exhausted worker pool (PHP-FPM pm.max_children, or Gunicorn/Puma/Unicorn workers), a crash-looping app, an active rate limit, or a leftover maintenance flag such as WordPress's .maintenance file.
- Error type
- HTTP 5xx server error
- Whose side
- Almost always the website
- Fix difficulty
- Moderate (website owner)
- Common cause
- Server overload or maintenance
What does 503 Service Unavailable mean?
A 503 Service Unavailable is an HTTP status code that means the server got your request but is not in a state to handle it right now. The machine is reachable and running. The application behind it, though, is overloaded, restarting, throttling traffic, or deliberately switched off for maintenance.
The server is choosing to refuse rather than failing to be reached, so a 503 is nearly always something on the website's side, not your browser, device, or connection. A well-behaved 503 includes a Retry-After header telling clients how long to wait. As a visitor there is not much to do beyond waiting and reloading.
- 503
- HTTP status code
- 5xx
- Server-side error class
- Retry-After
- Header that tells clients when to return
How the 503 Service Unavailable error appears
The wording changes depending on your browser, device, or server. Here is how this error commonly shows up:
503
Service Unavailable
The server is temporarily unable to service your request.
503 Service Unavailable503 Service Temporarily UnavailableHTTP Error 503Error 503 Service UnavailableHTTP Server Error 503503 Backend fetch failed (Varnish)
503 vs 500, 502 and 429
All four are server-side responses, but a 503 specifically means the server is reachable yet temporarily refusing the request, which sets it apart from a crash, a bad gateway reply, or a per-client rate limit.
| Code | What it means | Who fixes it |
|---|---|---|
| 500 Internal Server Error | The server hit an unexpected fault while handling the request, such as an unhandled exception or a code or config bug. Unlike a 503 it signals a genuine failure, not a deliberate or temporary refusal. | Website owner or developer (fix the underlying error in code, config, or logs) |
| 502 Bad Gateway | A proxy or load balancer reached the upstream server but got an invalid or empty reply. The origin answered wrongly, whereas a 503 means it answered correctly that it cannot serve you yet. | Website owner (fix or restart the unhealthy upstream behind the proxy) |
| 503 Service Unavailable | The server is up but cannot handle the request right now because it is overloaded, restarting, throttling, or in maintenance. It is usually temporary and may carry a Retry-After header. |
Website owner (add capacity, end maintenance, or fix the crash or throttle); visitors can only wait |
| 429 Too Many Requests | One client sent too many requests in a given window and is being rate limited, so it is scoped to you rather than the whole website. A 503 from throttling affects traffic broadly, while a 429 targets a single client. | The client (slow down and honor Retry-After); the owner can also adjust the rate limits |
Cloudflare edge errors that can look like a 503
When a CDN sits in front, the exact 5xx code tells you whether the edge or the origin failed, often before you open a log.
| Code | Cloudflare meaning | Where the fault sits |
|---|---|---|
520 | Web Server Returned an Unknown Error | Origin sent an empty, unexpected, or malformed reply Cloudflare could not parse |
521 | Web Server Is Down | Origin actively refused the connection, often a firewall blocking Cloudflare IPs or a stopped service |
522 | Connection Timed Out | Cloudflare could not establish a TCP connection to the origin in time |
523 | Origin Is Unreachable | Cloudflare could not route to the origin, usually a bad DNS or IP record |
524 | A Timeout Occurred | Connection opened but the origin sent no HTTP response within roughly 120s |
503 | Service Unavailable (passed through or from the edge) | Origin returned a real 503, or no backend passed the load balancer health check |
What causes 503 Service Unavailable?
- A traffic spike has overloaded the server, so it is shedding requests because CPU, memory, or connection limits are maxed out.
- The website is in maintenance mode for a deploy or update and returns 503 on purpose (WordPress writes a
.maintenancefile during updates; many frameworks have an equivalent mode). - The application server or process pool has crashed or is restarting, leaving the web server with nothing healthy to forward requests to.
- The PHP-FPM or worker pool is exhausted:
pm.max_childrenreached, say, or every Gunicorn, Puma, or Unicorn worker busy, so new requests queue or get rejected. - Rate limiting or DDoS protection is throttling traffic right now, answering 503 to anything above the allowed threshold.
- A CDN or reverse proxy such as Cloudflare, Fastly, or Nginx cannot reach a healthy origin (no backend passed the load balancer health check) and serves its own 503.
- Autoscaling has lagged behind demand, so too few healthy instances sit behind the load balancer to carry the current load.
How to find the cause fast
- Open your host's status page and confirm whether scheduled maintenance is running.
- In your hosting dashboard, look at server load: CPU, memory, and the connection or worker limits.
- Read the web server and application logs for the underlying error (
/var/log/nginx/error.log,wp-content/debug.log). - Bypass the CDN or proxy and hit the origin directly. That tells you whether the 503 is coming from the edge or from your server.
How 503 Service Unavailable looks from the outside
A 503 is one of the rare outages a server announces about itself, so an external check sees a clean HTTP 503 instead of a connection timeout. When the response carries a Retry-After header, a well-behaved monitor can back off rather than pounding a server that is already struggling. Keep an eye on one pattern in particular: 503s that bunch up around your deploy windows. That is usually maintenance mode or a crash loop, not real traffic overload.
To confirm the exact code a URL returns, or to re-test several at once after a fix, run them through the free bulk URL status checker.
How to fix 503 Service Unavailable
If you are a visitor
- Give it a minute, then reload. A 503 is often temporary and clears once the server recovers or maintenance wraps up. If the response carries a
Retry-Aftervalue, that is roughly how long to wait. - Reload the page instead of resubmitting a form, so you do not fire off a duplicate action once the website is back.
- Open the website in a private window or a different browser. That rules out a stale cached error page.
- See whether it is down for everyone with Is Website Down? If it is down for all, the fault is on their end and waiting is your only move.
- Bother with your own connection only if other websites are failing too. A 503 almost never points at your network, since the server clearly answered you.
If you run the website
- First, make sure you did not leave maintenance mode on. On WordPress, an interrupted update can leave a stray
.maintenancefile in the website root; deleting it usually brings the website back. - Look at server resources and load. If a spike is exhausting CPU, memory, or connections, add capacity or scale out so healthy instances keep up, and check that autoscaling thresholds fire early enough.
- Confirm the application is actually running. Check that PHP-FPM, your app server, or your container is up, restart it if it crashed, then watch that it stays up instead of crash-looping.
- If requests are queueing, size the worker pool to your traffic and CPU (PHP-FPM
pm.max_children, or the worker count for Gunicorn, Puma, or Unicorn) and fix any slow requests tying workers up. - Revisit your rate limiting and DDoS rules. Throttling real traffic? Loosen the limits or allowlist the affected clients. Under attack? Leave the protection on and mitigate at the edge.
- When a load balancer or CDN sits in front, check its origin health checks. A 503 from Cloudflare, an AWS ELB, or Nginx
upstreamusually means no backend passed the check, so fix or replace the unhealthy origins. - Send a correct
Retry-Afterheader with intentional 503s (maintenance or throttling) so clients, crawlers, and monitors know it is temporary and when to retry. - Read the application and web server logs for the root cause: out-of-memory kills, fatal errors, exhausted database connections, or a plugin, extension, or deploy you just introduced.
Still not fixed? Next steps
- When the 503 lines up with your deploy windows, it is maintenance mode or a crash loop rather than real overload. Look for a stuck maintenance flag, then restart and watch whether the app actually stays up.
- Requests piling up under load? Size the worker pool to your traffic and CPU, and chase down the slow requests that pin workers. Throwing hardware at it alone rarely fixes the queue.
- A 503 from a load balancer or CDN means you check origin health. No backend passing the check tells you every instance is unhealthy, so repair or replace the origins.
- If real users are getting throttled, loosen the rate limit or allowlist them. If it is an attack, leave the protection on and absorb it at the edge instead of the origin.
Code & configuration
Copy-paste starting points. Replace example.com and the paths with your own, and test changes on staging before production.
Return a correct Retry-After with intentional 503s (Nginx)
error_page 503 @maintenance;
location @maintenance {
add_header Retry-After 3600 always;
return 503;
}
Clear a stuck WordPress maintenance state
# an interrupted update leaves this file in the website root
rm /var/www/html/.maintenance
How to prevent 503 Service Unavailable
A 503 often lasts only seconds or minutes, which is exactly why it slips through until a customer reports it. Pulsetic checks your website and key endpoints from multiple locations as often as every 30 seconds, and alerts you by email, SMS, voice call, Slack, Discord, and more the moment they start returning 503s or stop responding. It will not tell you which worker pool filled up, but it will tell you quickly that something is failing, and when it recovers, so you can move before your visitors do.
Learn how Pulsetic's uptime monitoring detects this from the outside, across 15+ locations.
Frequently asked questions
-
Is a 503 the same as the website being down?
Not quite. The server is up and answering you, which is why you get a real 503 rather than a connection failure or timeout. For a visitor the effect is identical: the page will not load. The distinction matters most to the owner, since a 503 points to overload, maintenance, or throttling rather than a server that is fully offline.
-
How long does a 503 error last?
That depends on the cause. A 503 from a brief spike or a quick restart can clear in seconds. One from scheduled maintenance runs as long as the work does, and a
Retry-Afterheader may state exactly how long. A 503 from a crash-looping app or a misconfigured load balancer stays until someone fixes it. -
What is the difference between a 503, a 502, and a 504?
All three are server-side, but they say different things. A 502 Bad Gateway means a proxy got an invalid or empty reply from the upstream server. A 504 Gateway Timeout means the upstream did not reply in time. A 503 Service Unavailable means the server is reachable but refusing the request right now because it is overloaded, restarting, or in maintenance.
-
Can refreshing the page fix a 503?
Sometimes. If the server was only briefly overloaded or restarting, a reload a little later often works. If the 503 keeps returning, the cause is ongoing on the server side and only the website owner can clear it. Do not hammer refresh, though, since the extra requests pile more load onto a server that is already struggling.
-
Does a 503 error hurt SEO?
A short-lived 503 is actually the SEO-safe way to be unavailable. Google reads a 503 as temporary and comes back later instead of dropping the page, which is exactly why it recommends returning 503 during planned downtime rather than a 200 error page or a 404. Add a
Retry-Afterheader so Googlebot knows when to return. Trouble only starts if the 503s drag on for more than a day or two, because at that point Google may decide the pages are gone and pull them from the index. -
Why does WordPress return a 503 during updates or under load?
When you update core, a plugin, or a theme, WordPress drops a
.maintenancefile in the website root and serves a 503 on purpose until the work finishes. Interrupt that update and the file can stick around, which keeps the 503 going until you delete it. Load is the other trigger: the Heartbeat API hammersadmin-ajax.phpon a loop (think open editor tabs), and on shared hosting that can chew through every PHP process you are allowed. Throttling or switching off Heartbeat and bumping worker limits usually sorts it. -
Can a 503 be intentional, and why does Cloudflare sometimes return one?
Yes, plenty of 503s are on purpose: maintenance mode, deploy windows, and rate limiting all return 503 by design to hold traffic back for a moment. When the 503 comes from a CDN or reverse proxy such as Cloudflare, Fastly, or Varnish, it usually means the edge could not get a healthy reply from your origin, often because no backend passed the health check or the origin is buried under load. Bypass the CDN and hit the origin directly to separate an intentional edge 503 from a failing server behind it.
-
Catch the next outage before your visitors do.
2-minute setup · Cancel any time
-
No credit card needed