Skip to content
← Все статьи

Ошибка 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 ошибки

  1. Перегрузка сервера — CPU/RAM исчерпан, worker'ы заняты.
  2. Maintenance mode — админ выключил сайт на обновление.
  3. PHP-FPM пул исчерпан — все children заняты, новые запросы в очереди.
  4. Rate limiting — nginx limit_req или Cloudflare ограничили трафик.
  5. Healthcheck fail в Kubernetes — pod не готов, readinessProbe failed.
  6. Upstream overload за load balancer — все backend'ы сигналят как unhealthy.

Отличия от 500 и 502

КодЧто случилосьВиновник
500Исключение в коде приложенияПрикладной код
502Proxy не получил валидный ответ от upstreamUpstream недоступен
503Сервер временно недоступен (известная причина)Перегрузка / maintenance
504Timeout ожидания 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: 3

SEO-безопасный maintenance

Правильный maintenance-режим:

После 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.

Проверьте ваш сайт прямо сейчас

Проверить →
Другие статьи: HTTP
HTTP
429 Too Many Requests: rate limiting и обход
15.04.2026 · 10 просм.
HTTP
HTTP/2 и HTTP/3: чем отличаются и что быстрее
13.03.2026 · 37 просм.
HTTP
Ошибка 404 Not Found: 7 причин и как исправить
15.04.2026 · 14 просм.
HTTP
Ошибка 403 Forbidden: 8 способов исправить
15.04.2026 · 8 просм.