limit_req_zone

Тема дорожной карты · Nginx

Директива limit_req_zone в Nginx определяет зону разделяемой памяти, отслеживающую скорость запросов для заданного ключа, и является основой ограничения скорости в Nginx для защиты эндпоинтов веб-сервера от злоупотреблений, brute-force-атак и пиков трафика. Директива размещается в блоке http и имеет вид limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;, где $binary_remote_addr использует IP-адрес клиента как ключ зоны, 10m выделяет 10 МБ разделяемой памяти (достаточно примерно для 160 000 записей IP), а rate=10r/s ограничивает максимум до 10 запросов в секунду на ключ. Зона затем указывается в блоке location директивой limit_req zone=req_limit burst=20 nodelay;, применяющей ограничение скорости ко всем совпадающим запросам, проходящим через обратный прокси Nginx. Более точный подход использует $http_x_api_key или $http_authorization в качестве ключа зоны для ограничения скорости по API-потребителю, а не по IP, что более значимо, когда клиенты делят один egress-адрес за NAT-шлюзом. Сочетание limit_req_zone с limit_conn_zone и подходящими значениями burst даёт развёртываниям Nginx комплексную многоуровневую защиту от злоупотреблений как по измерению соединений, так и по измерению запросов.

Как это работает

limit_req_zone использует модули limit_req и limit_conn. Определите зону (limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;) и примените (limit_req zone=mylimit burst=20 nodelay;). binary_remote_addr ключует по IP (мало места); используйте $http_x_forwarded_for за load balancer. limit_conn ограничивает конкурентные соединения. Комбинируйте с fail2ban для IP-blocking постоянных нарушителей; с WAF (ModSecurity, naxsi) для L7-атак.

Когда применять

Rate limit на login-эндпойнты с первого дня (5 req / 15 min на IP). Лимит общего трафика на IP против скрейпинга (100 req/s burst 200). Разные зоны на endpoint-паттерн (/api/expensive — 1 req/s; /api/cheap — 100 req/s). За load balancer всегда forwarded-for IP, никогда LB IP.

Типичные ошибки

Ловушки limit_req_zone: rate limit по source IP за CDN/load balancer, скрывающим реальный client IP (все упираются в лимит IP LB); burst слишком низкий (легитимные всплески упираются в лимит); не возвращают нормальный 429 с Retry-After (клиенты долбят эндпойнт); rate-limit аутентифицированных юзеров по IP, когда они делят офисный NAT.

Связанные понятия

Полезные ресурсы