Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
Nginx Error 503: Service Temporarily Unavailable (limiting requests, excess: ... by zone) Linux / DevOps

Nginx 503: limiting requests excess by zone — Настройка Rate Limit

Обновлено: 18.08.2026  ·  Официальная база знаний

Пользователи или API-клиенты сталкиваются со статусом 503 Service Temporarily Unavailable при частых запросах. В error.log Nginx появляется запись троттлинга: limiting requests, excess: 5.200 by zone "one", client: 198.51.100.25, server: api.example.com, request: "POST /api/v1/auth HTTP/1.1".

ПараметрЗначение в конфигеПоведение алгоритма Leaky Bucket
rate=1r/sБазовая скоростьРазрешен строго 1 запрос в секунду на ключ (IP)
burst=5Размер буфераВсплеск до 5 запросов ставится в очередь с задержкой
nodelayФлаг немедленной отдачиВсплеск отдается без задержки, запросы сверх лимита сразу сбрасываются по 503
  • API-клиенты, мобильные приложения или пользователи за общим NAT/VPN получают 503 ошибку при одновременной загрузке страницы со множеством ассетов.
  • Всплески легитимного трафика блокируются встроенной защитой Nginx Rate Limiting.
  1. Найдите объявление зон ограничения запросов в nginx.conf (обычно в блоке http):
    grep -rn "limit_req_zone" /etc/nginx/
  2. Увеличьте базовый лимит скорости и настройте параметр burst с флагом nodelay в целевом блоке location:
    # В блоке http: зона памяти 10MB с базовым рейтом 10 запросов в секунду
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
    
    # В блоке server/location: разрешаем кратковременный всплеск до 20 запросов без искусственной задержки
    location /api/ {
        limit_req zone=api_limit burst=20 nodelay;
        limit_req_status 429; # Рекомендуется возвращать 429 Too Many Requests вместо 503
        proxy_pass http://backend;
    }
  3. Настройте исключения (White-list) для доверенных IP и сервисов мониторинга через geo и map:
    geo $limit {
        default 1;
        127.0.0.1 0;
        10.0.0.0/8 0;
        203.0.113.50 0;
    }
    
    map $limit $limit_key {
        0 "";
        1 $binary_remote_addr;
    }
    
    limit_req_zone $limit_key zone=api_limit:10m rate=10r/s;
  4. Проверьте конфигурацию и примените настройки: sudo nginx -t && sudo systemctl reload nginx.
DevOps Рекомендация: Всегда заменяйте стандартный код ответа на limit_req_status 429;. Код 429 (Too Many Requests) является семантически корректным по RFC 6585 и позволяет клиентам отличать падение сервера (503) от попадания под лимиты частоты запросов.
Практический опыт инженера: Если сервер находится за Cloudflare или AWS ALB, использование `$binary_remote_addr` заблокирует IP-адреса самих прокси. Обязательно настройте модуль `ngx_http_realip_module` перед внедрением `limit_req`.

Частые вопросы (FAQ)

Как работает алгоритм Leaky Bucket в Nginx?

Алгоритм представляет собой 'дырявое ведро': запросы поступают с любой скоростью, но обрабатываются со строго фиксированной скоростью rate. Если входящий поток превышает rate + burst, 'ведро' переполняется, и Nginx сбрасывает избыток запросов.

Почему все пользователи корпоративной сети попадают под лимит?

Если тысячи сотрудников выходят в интернет через один публичный NAT IP, то при использовании ключа $binary_remote_addr Nginx считает весь их трафик за одного единственного клиента.

Сколько памяти занимает зона 10m в limit_req_zone?

Зона размером 10 мегабайт способна хранить в оперативной памяти около 160 000 уникальных IP-адресов в формате $binary_remote_addr (по 64 байта на состояние).

Чем отличается поведение с nodelay от поведения без него?

Без nodelay избыточные запросы из burst ставятся в очередь и выполняются с искусственной задержкой. С флагом nodelay запросы из burst выполняются мгновенно, но новые запросы сверх емкости burst блокируются сразу.