Nginx 503: limiting requests excess by zone — Настройка Rate Limit
Пользователи или 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.
- Найдите объявление зон ограничения запросов в
nginx.conf(обычно в блокеhttp):grep -rn "limit_req_zone" /etc/nginx/ - Увеличьте базовый лимит скорости и настройте параметр
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; } - Настройте исключения (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; - Проверьте конфигурацию и примените настройки:
sudo nginx -t && sudo systemctl reload nginx.
limit_req_status 429;. Код 429 (Too Many Requests) является семантически корректным по RFC 6585 и позволяет клиентам отличать падение сервера (503) от попадания под лимиты частоты запросов.Частые вопросы (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 блокируются сразу.