Nginx limit_req_zone: ограничить запросы по IP
limit_req_zone хранит счётчики в общей памяти, а limit_req задаёт лимит для выбранного ключа, например IP-адреса. rate определяет средний темп, burst — допустимый всплеск, а nodelay пропускает этот всплеск сразу вместо постепенной задержки.
Ограничить API до пяти запросов в секунду
Зону объявите в контексте http, а правило и код отказа задайте в нужном location:
http {
limit_req_zone $binary_remote_addr zone=api_per_ip:10m rate=5r/s;
upstream backend {
server 127.0.0.1:8000;
}
server {
listen 80;
location /api/ {
limit_req zone=api_per_ip burst=20 nodelay;
limit_req_status 429;
proxy_pass http://backend;
}
}
}В этом примере Nginx допускает краткий всплеск до 20 запросов сверх среднего лимита; лишние запросы получают HTTP 429. Большой burst с nodelay мгновенно передаёт много запросов upstream, поэтому выбирайте его с учётом нагрузки приложения.
Если Nginx стоит за балансировщиком, сначала настройте real IP только для доверенных адресов прокси. Иначе $binary_remote_addr может видеть один адрес балансировщика для всех клиентов. Перед перезагрузкой проверьте конфигурацию командой nginx -t.
Документация: ngx_http_limit_req_module.