503 Service Unavailable
Применение
Код состояния 503 Service Unavailable означает, что сервер не может выполнить HTTP-запрос по временной причине. Сервер перегружен внезапным всплеском трафика, ресурс заблокирован, сервер перезагружается или запрос блокируется из-за неверной конфигурации межсетевого экрана.
Многие сайты возвращают код состояния 503 Service Unavailable во время технического обслуживания — это рекомендуемый подход, позволяющий не задеть позиции в поиске.
Когда серверу известна природа проблемы, например ресурс заблокирован или перегружен, HTTP-заголовок Retry-After сообщает клиенту, когда следует повторить запрос.
Amazon S3 возвращает 503 Slow Down, когда частота запросов превышает ограничения пропускной способности на префикс. Внезапный скачок выше этих порогов включает троттлинг, пока S3 в фоновом режиме масштабирует разделы. Распределение объектов по нескольким префиксам, экспоненциальная задержка перед повтором и постепенное наращивание частоты запросов позволяют избежать этой ошибки. S3 не взимает плату за ответы 503.
Fastly возвращает 503 Service Unavailable с пояснительным текстом “Loop detected”, когда запрос, судя по всему, маршрутизируется обратно в тот же сервис Fastly или прошёл через слишком много серверов Fastly. Fastly отслеживает переходы запроса с помощью заголовков Fastly-FF и CDN-Loop. Запрос отклоняется как петля при превышении любого из этих пределов: более трёх предыдущих посещений одного и того же POP для одного сервиса, более шести уникальных сервисов Fastly на пути запроса или более двадцати переходов суммарно по всем сервисам. Петли обычно возникают, когда одно и то же имя хоста настроено и как домен, и как бэкенд сервиса, а DNS для этого имени разрешается в Fastly. Использование отдельного имени хоста источника (например, origin.example.re) или IP-адреса для бэкенда устраняет петлю.
Примечание
503 означает, что сервер временно недоступен для всех клиентов (перегрузка, обслуживание). 429 означает, что конкретный клиент превысил свой лимит частоты запросов. Используйте 429 для троттлинга отдельных клиентов и 503 для недоступности сервера в целом.
Влияние на SEO
Googlebot воспринимает ошибки 5xx как сигнал временно снизить скорость сканирования по всему сайту. Ранее проиндексированные URL сначала сохраняются, но длительный простой приводит к тому, что Google удаляет их из индекса. Любое содержимое, возвращённое с ответом 503, игнорируется. Google относится к 500, 502 и 503 одинаково. Для планового обслуживания 503 не имеет особого преимущества перед другими кодами 5xx, вопреки распространённым советам. Ошибка 5xx на файле robots.txt гораздо серьёзнее, даже если каждая другая страница сайта возвращает 200. Google приостанавливает сканирование на срок до 12 часов, затем до 30 дней опирается на кэшированную копию. Если ошибка сохраняется, Google полностью исключает сайт из индекса. Bingbot учитывает Retry-After в ответах 503 при планировании повторных визитов. Постоянные ответы 503 препятствуют индексации в Bing.
Пример
Клиент запрашивает ресурс, и сервер отвечает 503 Service Unavailable, поскольку ресурс временно недоступен. Заголовок Retry-After предлагает повторить запрос через 30 минут.
Запрос
GET /latest_quotes HTTP/1.1
Host: example.com
Ответ
HTTP/1.1 503 Service Unavailable
Content-Type: text/html; charset=UTF-8
Content-Length: 124
Retry-After: 1800
<html>
<head>
<title>Resource Busy</title>
</head>
<body>
<p>Try again after 30 minutes.</p>
</body>
</html>
Как исправить
Определите, является ли 503 намеренным (режим обслуживания) или незапланированным (перегрузка, сбой). Намеренный 503 вместе с заголовком Retry-After не требует отладки — нужно лишь дождаться окончания работ.
Для незапланированных ошибок 503 проверьте эти распространённые причины:
Исчерпание ресурсов сервера. Запустите на сервере top, htop или vmstat. Высокая загрузка CPU или памяти означает нехватку мощности. В Apache журнал ошибок показывает “server reached MaxRequestWorkers setting”, когда заняты все рабочие слоты. Увеличьте MaxRequestWorkers (и ServerLimit для prefork MPM) в конфигурации Apache. В nginx увеличьте worker_connections в блоке events.
Сбой пула приложений. Завершение PHP-FPM, Gunicorn или подобного менеджера процессов под нагрузкой оставляет веб-сервер без бэкенда для обслуживания запросов. Проверьте журналы менеджера процессов, затем увеличьте размер пула (pm.max_children в PHP-FPM, —workers в Gunicorn).
Исчерпание пула соединений. Опустошение пулов соединений с базой данных или внешним API вынуждает приложение отклонять новые запросы. Увеличьте размер пула в конфигурации приложения и убедитесь, что соединения корректно освобождаются после использования.
Ограничение частоты запросов. Модули nginx limit_req и limit_conn возвращают 503 (или пользовательский статус) при превышении порогов. Пересмотрите директивы limit_req_zone и limit_conn_zone. Увеличьте значения burst или добавьте nodelay, чтобы сглаживать всплески трафика.
Отказ проверки работоспособности на балансировщике нагрузки. Неуспешная проверка работоспособности выводит сервер из ротации. В AWS ALB/NLB проверьте состояние целей в консоли. В блоках upstream nginx пересмотрите настройки max_fails и fail_timeout.
Перезапуск, вызванный развёртыванием. Поэтапные развёртывания со слишком малым числом экземпляров вызывают короткие окна с 503. Увеличьте минимальное число работоспособных экземпляров или используйте сине-зелёное развёртывание.
Троттлинг AWS S3 (503 Slow Down). S3 ограничивает запросы, превышающие лимиты частоты запросов на префикс. Распределите объекты по нескольким префиксам с помощью рандомизированных префиксов ключей (например, hex-hash/original-key). Реализуйте экспоненциальную задержку, начиная с 1 секунды. Наращивайте частоту запросов постепенно, вместо отправки трафика всплесками. AWS SDK при правильной настройке автоматически повторяет запросы после ответов 503 SlowDown с нарастающей задержкой.
При всплесках трафика добавьте CDN или слой кэширования, чтобы разгрузить статические запросы. Настройте мониторинг и оповещения по доле ответов 503, чтобы нехватка ресурсов проявлялась до полного отказа.
Примеры кода
.NET
HttpStatusCode.ServiceUnavailable
Rust
http::StatusCode::SERVICE_UNAVAILABLE
Rails
:service_unavailable
Go
http.StatusServiceUnavailable
Symfony
Response::HTTP_SERVICE_UNAVAILABLE
Python3.5+
http.HTTPStatus.SERVICE_UNAVAILABLE
Java
java.net.HttpURLConnection.HTTP_UNAVAILABLE
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_SERVICE_UNAVAILABLE
Angular
@angular/common/http/HttpStatusCode.ServiceUnavailable