Ошибка 503 Service Unavailable: причины и решения
Ошибка 503 Service Unavailable — это сервер, который говорит «я жив, но сейчас не могу обслужить запрос». В отличие от 500, это НЕ exception: причина известна серверу и обычно временная. Разберём, какие реальные сценарии вызывают 503, как её правильно использовать как инструмент maintenance, и как быстро восстановить сервис.
Что означает 503
По RFC 9110 §15.6.4, код 503 означает, что сервер временно не в состоянии обработать запрос из-за перегрузки или планового обслуживания. Это временное состояние — клиент должен повторить запрос позже.
Важно: 503 ДОЛЖЕН сопровождаться заголовком Retry-After, указывающим, через сколько секунд повторить запрос. Это критично для поисковых ботов — Googlebot корректно обрабатывает 503 с Retry-After и не деиндексирует сайт.
6 частых причин 503 ошибки
- Перегрузка сервера — CPU/RAM исчерпан, worker'ы заняты.
- Maintenance mode — админ выключил сайт на обновление.
- PHP-FPM пул исчерпан — все children заняты, новые запросы в очереди.
- Rate limiting — nginx
limit_reqили Cloudflare ограничили трафик. - Healthcheck fail в Kubernetes — pod не готов, readinessProbe failed.
- Upstream overload за load balancer — все backend'ы сигналят как unhealthy.
Отличия от 500 и 502
| Код | Что случилось | Виновник |
|---|---|---|
| 500 | Исключение в коде приложения | Прикладной код |
| 502 | Proxy не получил валидный ответ от upstream | Upstream недоступен |
| 503 | Сервер временно недоступен (известная причина) | Перегрузка / maintenance |
| 504 | Timeout ожидания upstream | Медленный upstream |
Диагностика
Проверьте внешне через HTTP Header Checker от Enterno.io — увидите код и заголовок Retry-After. Если его нет, сервер не настроил 503 правильно.
curl -I https://example.com
# HTTP/2 503
# Retry-After: 120
# Content-Type: text/html
# Сервер: проверьте нагрузку
top -bn1 | head -20
free -m
ss -s
# PHP-FPM status
systemctl status php8.4-fpm
curl http://127.0.0.1/fpm-statusРешения
nginx: правильный 503 для maintenance
server {
# Maintenance toggle
if (-f /var/www/maintenance.flag) {
return 503;
}
error_page 503 @maintenance;
location @maintenance {
root /var/www/maintenance;
rewrite ^(.*)$ /503.html break;
add_header Retry-After 300 always;
}
}PHP: 503 во время деплоя
<?php
if (file_exists(__DIR__ . '/maintenance.flag')) {
header('HTTP/1.1 503 Service Unavailable');
header('Retry-After: 300');
header('Content-Type: text/html; charset=utf-8');
readfile(__DIR__ . '/503.html');
exit;
}PHP-FPM: увеличение worker пула
# /etc/php/8.4/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500Рассчитывайте max_children как (RAM_MB - 500) / 30, где 30MB — средний размер PHP worker.
Rate limiting без 503-хаоса
limit_req_zone $binary_remote_addr zone=api:10m rate=60r/m;
location /api/ {
limit_req zone=api burst=20 nodelay;
limit_req_status 429; # лучше 429 чем 503 для rate limit
proxy_pass http://backend;
}Для rate limiting используйте 429 Too Many Requests, не 503.
Kubernetes readinessProbe
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 3SEO-безопасный maintenance
Правильный maintenance-режим:
- Верните 503 (не 200!)
- Укажите Retry-After в секундах
- Держите maintenance не более 24 часов
- Не меняйте
robots.txtнаDisallow: / - Не редиректьте на статичную страницу с 200
После maintenance сразу проверьте сайт через Uptime Monitoring — настройте алерт на любое отклонение от 200.
Часто задаваемые вопросы (FAQ)
В: 503 во время деплоя — это нормально?
О: Да, если коротко (<30 сек) и с Retry-After. Для zero-downtime deploy используйте blue-green или rolling deployment.
В: Google деиндексирует сайт при 503?
О: Нет, если 503 длится до 24-48 часов. При затяжных 503 (>1 недели) деиндексация начинается.
В: Как автоматически узнать о 503?
О: Enterno.io Monitors с expected_code=200 шлёт алерт через Email/Telegram/Slack за секунды.
В: Нужен ли Retry-After?
О: Да, обязательно. Без него клиенты и боты агрессивно ретраят, усугубляя нагрузку.
Заключение
503 — это инструмент, а не баг, когда используется правильно. Ключи: всегда возвращайте Retry-After, настройте PHP-FPM пул под реальную нагрузку, используйте 429 для rate limiting, и мониторьте сайт через Enterno.io.
Проверьте ваш сайт прямо сейчас
Проверить →