Ограничение запросов
Тема дорожной карты · Nginx
Ограничение скорости запросов в Nginx — мощный механизм защиты вышестоящих серверов приложений от пиков трафика, brute-force-атак на авторизацию и условий отказа в обслуживании путём ограничения числа запросов, которые клиент может выполнить за определённый временной интервал. Ограничение скорости в Nginx реализовано через модуль ngx_http_limit_req_module: директива limit_req_zone в контексте http определяет зону разделяемой памяти, отслеживающую скорость запросов, ключом которой служит IP клиента ($binary_remote_addr) по алгоритму «дырявого ведра», а директива limit_req в блоке server или location применяет ограничение с опциональным параметром burst, допускающим кратковременные всплески трафика. Например, limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s создаёт зону размером 10 МБ, допускающую 10 запросов в секунду на IP, а limit_req zone=api burst=20 nodelay допускает всплески до 20 дополнительных запросов, обрабатываемых немедленно, а не ставящихся в очередь. При превышении ограничения скорости Nginx по умолчанию возвращает статус 429 Too Many Requests (настраивается через limit_req_status), а событие журналируется с использованием limit_req_log_level. Сочетание ограничения скорости Nginx с limit_conn (ограничением соединений) обеспечивает комплексную многоуровневую защиту для любого высоконагруженного обратного прокси или API-шлюза.
Как это работает
Ограничение запросов использует модули 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.
Типичные ошибки
Ловушки Ограничение запросов: rate limit по source IP за CDN/load balancer, скрывающим реальный client IP (все упираются в лимит IP LB); burst слишком низкий (легитимные всплески упираются в лимит); не возвращают нормальный 429 с Retry-After (клиенты долбят эндпойнт); rate-limit аутентифицированных юзеров по IP, когда они делят офисный NAT.