Geonode logo
Website and server errors

How to Fix a 503 Service Unavailable Error

Tell an outage from a rate limit or a failing proxy, then retry the way the server asks.

Updated

TL;DR

503 Service Unavailable means the server that answered cannot take requests for a while; it may be the site's app, its load balancer or CDN, or your proxy. Wait a few minutes before you reload the page.

How servers and clients word a 503

Server pages name the sender; browsers and libraries print their own text around the code.

WhereWhat you see
nginx (default error page)503 Service Temporarily Unavailable
Apache httpd (default error page)Service Unavailable The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
HAProxy (no server available)503 Service Unavailable No server is available to handle this request.
Chrome (503 with an empty body)This page isn't working. shop.example.org is currently unable to handle this request. HTTP ERROR 503
Varnish Cache (built-in error page)Error 503 Backend fetch failed
Python requests (raise_for_status)requests.exceptions.HTTPError: 503 Server Error: Service Unavailable for url: https://api.example.org/items
Node.js with axiosAxiosError: Request failed with status code 503

Why this happens

The site is too busy or closed for maintenance, so it turns visitors away.

Most often the site's app is overloaded, or the load balancer in front of it has no working server. Rate limiters send 503 too: nginx does by default, and Amazon S3 says Slow Down.

Diagnose your 503 first

Each check rules out one sender, starting with two you can run in any browser.

  • Look for a return time or the word maintenance on the page; if either appears, the owner took the site down on purpose.

  • View the page source and search for cloudflare; if found, a Cloudflare data center sent the 503, otherwise the site or your proxy did.

  • If only your script gets 503, run it with one connection; if the 503s stop, a rate limiter sent them.

  • Run curl -v through the proxy; a 503 right after CONNECT is the proxy's, one after the proxy's 200 is the site's.

  • Search your nginx error log for limiting requests at the 503's time; a match means your own rate limit, not overload, sent it.

Solutions ranked by effectiveness

The first card clears most 503s; the second covers a failing proxy, the third your own server.

  1. Most common fix

    Retry once after the requested wait

    For scripts and apps: wait at least the time Retry-After gives, in seconds or as a date, or 30 seconds without it. Retry once; give up if the server asks for over five minutes.

    curl -sS --retry 1 --retry-delay 30 --retry-max-time 300 \
      -o page.html -w '%{http_code}\n' \
      https://example.com/
  2. Check next

    Fix the proxy route when only it fails

    Applies when the proxy refused the request itself and the site loads without it.

    1. Fix any typo in the hostname; Squid answers 503 when a name does not resolve.

    2. Lower how many connections you open through the proxy at the same time.

    3. If it keeps failing, give your provider the time, target host and proxy port.

  3. Site owners

    Restore the backend or relabel the limit

    For a 503 from your own app, Apache, HAProxy or nginx: apply the change that matches its log, then test and reload the config.

    1. If app logs show CPU, memory or connection pool exhaustion, add capacity.

    2. If Apache logs AH00957, start the backend it names or fix that ProxyPass address.

    3. If HAProxy requests wait past timeout queue, add servers or raise maxconn where safe.

    4. Set limit_req_status and limit_conn_status to 429, so clients read a limit, not an outage.

Stop the 503 from coming back

Owners can make 503s shorter and clearer; script authors can avoid becoming part of the load.

  1. Send Retry-After with planned maintenance 503s, so clients and Google's crawlers know when to return.

  2. Keep 503 responses out of caches, since a cached error page can outlive the fix.

  3. End maintenance 503s within a day or two; Google slows crawling and eventually drops URLs that keep failing.

  4. Add a few random seconds to each worker's retry wait, so they do not all return at once.

Know the address you send fromYour dashboard lists every assigned ISP IP to name when you report a 503.
Try ISP proxies

Related errors

Learn more

FAQ

Your request reached a server that cannot handle it right now, most often because it is overloaded or in maintenance. RFC 9110 defines the condition as temporary, so the same request can work later unchanged.

It is a 503 your proxy returned, either its own or one passed on from the site. Janitor AI calls a Chutes model API connection a proxy, so its 503s come from Chutes.

It means your proxy, not the website, answered curl's CONNECT with 503 and opened no tunnel. This happens when the proxy is overloaded or cannot reach that host, so the site never saw your request.

Axios gives that message for every 503 reply, so the server or proxy you called sent it. Read Retry-After in error.response.headers; in a browser, a cross-origin API must list it in Access-Control-Expose-Headers.

Chutes sends it when no instance of the chosen model is running yet; a cold model needs a warmup first. Retry in a few minutes or pick another model, since changing proxy or network does nothing.

It is the server-error code for a temporary refusal: whoever answered cannot take requests now. In a 502 or 504, a gateway instead got an invalid reply, or none in time, from the server behind it.

An IP no stranger shares

Only you use a Dedicated ISP IP, so a per-IP limit counts just your requests.