👁 Классический limit_req в Nginx хорош, но статичен — чтобы изменить лимиты, нужно править конфиг и делать reload. В проде это неудобно, особенно если нужно быстро «придушить» конкретный endpoint или IP. Решение — использовать shared memory зоны и переменные для более гибкого контроля.
📝 Настройка динамического rate limit через map
Можно задать разные лимиты для разных URI или клиентов прямо в конфиге, без дублирования блоков. Так лимит применяется только к нужным endpoint, а не ко всему трафику.
http {
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
map $request_uri $limit_key {
default "";
~^/api/ $binary_remote_addr;
}
server {
location / {
limit_req zone=api_limit burst=20 nodelay if=$limit_key;
}
}
}📝 Быстрое отключение/включение лимитов через переменные
Можно управлять лимитами через переменные, например, включая их только при определённых условиях. Это позволяет не тротлить healthcheck'и или внутренние сервисы.
map $http_user_agent $limit_enabled {
default 1;
"~*healthcheck" 0;
}
limit_req zone=api_limit burst=10 nodelay if=$limit_enabled;📝 Тонкая настройка burst и nodelay
Важно правильно настроить burst, чтобы не убить пользователей при кратковременных пиках. burst даёт запас для всплесков, а nodelay убирает очередь, сразу отбрасывая лишние запросы — полезно для защиты API.
limit_req zone=api_limit burst=20 nodelay;
❗️ Rate limiting — это не просто «ограничить запросы», а инструмент управления нагрузкой и защиты. Гибкая настройка через переменные позволяет реагировать на трафик без перезагрузок и даёт больше контроля в проде.
tags: #nginx #безопасность #оптимизация



