Nginx limit_req_zone: ограничить запросы по IP

Категория: Nginx · Обновлено:

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.