How to Fix 503 Service Unavailable
The server is alive but refusing work. Find out why.
A 503 means the server is temporarily unable to handle the request — overload or maintenance. Here's how to diagnose and fix it.
The server is alive but refusing work. Find out why.
A 503 means the server is temporarily unable to handle the request — overload or maintenance. Here's how to diagnose and fix it.
A 503 Service Unavailable response means the server is up but deliberately not serving requests. Unlike a 500 (application error) or 502 (proxy can't reach origin), a 503 is usually intentional: the server or a middleware layer has decided it can't handle traffic right now. The two common causes are overload and maintenance mode.
The good news is that 503s are often transient and self-recovering — a traffic spike passes, a deploy finishes, a worker pool drains. The bad news is that "transient" can mean minutes or hours, and recurrent 503s point to a capacity or config problem you need to fix, not wait out.
The most common cause is the origin running out of resources: worker processes, memory, or database connections. When the web server (Apache, Nginx, PHP-FPM, a Gunicorn/uWSGI worker pool) hits its connection limit, new requests get a 503 instead of queuing indefinitely. Check your process manager's status endpoint and logs for "max workers reached" or similar.
The fix is either to raise the limit (more workers, more memory) or to reduce the load (enable caching, queue background jobs, rate-limit expensive endpoints). Throwing more workers at it without fixing the underlying bottleneck just moves the wall — if each worker is slow because of a slow database query, more workers means more database load and a different failure. Profile first.
Many frameworks and platforms (WordPress, Magento, Shopify, Kubernetes rollouts) put the site in maintenance mode during deploys, returning 503 by design. If you're seeing 503s during a known deploy window, this is expected. If they persist after the deploy, the maintenance flag didn't clear — check for a `.maintenance` file, a maintenance flag in the database, or a stuck Kubernetes rollout.
For platforms that support it, configure a maintenance-mode window in your monitoring tool so you don't get paged for planned 503s. Outside that window, a 503 is a real incident. SurePing's HTTP monitoring treats 503 as down by default and will alert you the moment it appears, so you can distinguish a stuck maintenance mode from a clean deploy.
When a 503 hits in production: check whether a deploy is in progress, look at worker/memory utilization on the origin, inspect the web server error log for the specific reason the request was refused, and verify the database is reachable (a slow or down database often surfaces as 503 before it surfaces as a 500). If you're behind a load balancer, confirm all your origin instances aren't simultaneously in maintenance.
Once recovered, set up monitoring that catches the precursor signals — rising response time, growing worker count — before they become 503s. SurePing's response-time tracking on HTTP monitors gives you that trend data on every plan.