Rate-limit — первая линия защиты от ботов, брутфорса и простых DDoS-атак. Настраивается за 10 минут, работает годами.
flowchart TD
Req[Запрос] --> Check{Лимит?}
Check -->|"OK"| Allow[Пропустить]
Check -->|"Превышен"| Burst{Burst?}
Burst -->|"OK"| Queue[В очередь]
Burst -->|"Нет"| Reject[429 Error]
Queue --> Allow
Базовая настройка
http {\n # Зона для общих запросов: 10 req/sec на IP\n limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;\n \n # Зона для логина: 1 req/sec (жёстко)\n limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;\n \n # Зона для API: 30 req/sec\n limit_req_zone $binary_remote_addr zone=api:10m rate=30r/s;\n \n # Зона для поиска: 5 req/sec\n limit_req_zone $binary_remote_addr zone=search:10m rate=5r/s;\n}
Применение к location
# Защита логина (WordPress)\nlocation = /wp-login.php {\n limit_req zone=login burst=3 nodelay;\n # ... остальные директивы\n}\n\n# Защита админки\nlocation /wp-admin/ {\n limit_req zone=login burst=5 nodelay;\n # ... остальные директивы\n}\n\n# Защита API\nlocation /api/ {\n limit_req zone=api burst=50 nodelay;\n proxy_pass http://backend;\n}\n\n# Защита поиска\nlocation /search {\n limit_req zone=search burst=10 nodelay;\n # ...\n}
10 запросов в секунду с одного IP. Если больше — nginx вернёт 503.
«Запас» запросов. burst=20 разрешает всплеск до 20 запросов сверх лимита. Полезно для реальных пользователей.
Без nodelay nginx задерживает запросы в очереди. С nodelay — сразу 503. Для защиты лучше nodelay.
limit_req_log_level warn; чтобы видеть в логах, когда срабатывают лимиты.