Генератор лимитов запросов для nginx
Отметьте, что нужно защитить, — получите готовые строки limit_req для nginx с пояснениями, куда их вставить. Лимиты отсекают перебор паролей, массовые запросы к поиску и формам и снимают нагрузку от грубых ботов.
Содержание
Как работает limit_req
Модуль limit_req считает запросы с каждого адреса и пропускает их не быстрее заданной скорости. Всё, что сверх, nginx отклоняет с кодом 429 — до того, как запрос дойдёт до PHP, базы данных или приложения. Поэтому лимиты так хорошо снимают нагрузку от грубых ботов и перебора паролей.
- limit_req_zone — описывает зону: по какому ключу считать (обычно адрес) и с какой скоростью пропускать. Пишется в блоке http.
- limit_req — включает зону для конкретного адреса сайта. Пишется в server или location.
- burst — сколько запросов можно сделать «пачкой» сверх скорости. Нужен, чтобы не мешать людям, которые быстро кликают.
- nodelay — пачку пропускать сразу, а не растягивать во времени.
Какие значения выбрать
| Что защищаем | Скорость | Почему |
|---|---|---|
| Вход в админку | 5 в минуту | Человек не вводит пароль чаще. Перебору этого мало |
| Поиск, фильтры | 1–3 в секунду | Тяжёлые запросы к базе, люди редко ищут чаще |
| Формы | 3 в минуту | Человек не отправляет заявки подряд |
| API | 5–20 в секунду | Зависит от того, как часто его вызывает ваш интерфейс |
| Весь сайт | 10–30 в секунду | Страница с картинками и скриптами — это десятки запросов. Ставьте с запасом |
Начните с мягких значений и посмотрите в error.log, кто упирается в лимит. Если среди них люди — увеличьте скорость или burst.
Как проверить, что лимит работает
- Проверьте конфигурацию:
nginx -t, затемsystemctl reload nginx. - Сделайте несколько быстрых запросов подряд, например обновите страницу входа много раз. Должна появиться ошибка 429.
- В error.log появятся строки
limiting requestsс адресом и названием зоны.
Чего лимиты не умеют
Лимит считает запросы с одного адреса. Боты, которые ходят медленно и с тысяч разных адресов через резидентные прокси, в него не упираются: каждый адрес делает по паре запросов. Против таких ботов нужна проверка браузера и поведения. Лимиты и антибот хорошо дополняют друг друга: первые снимают нагрузку, второй отсекает замаскированных ботов.
Частые вопросы
Не заблокирует ли лимит поисковых роботов?
При разумных значениях — нет: роботы Яндекса и Google сами ограничивают скорость обхода. Общий лимит на весь сайт ставьте с запасом и следите за error.log.
Что такое код 429?
Too Many Requests — «слишком много запросов». Он честно говорит клиенту, что нужно подождать, и поисковые роботы правильно его понимают, в отличие от 503 или 403.
Где лежит конфиг nginx?
Основной файл — /etc/nginx/nginx.conf, настройки сайтов — в /etc/nginx/sites-available/ или /etc/nginx/conf.d/. Блок http находится в основном файле, server — в файле сайта.
Почему лимит не срабатывает?
Частые причины: запрос обрабатывает другой location, у которого нет limit_req; сайт стоит за прокси или CDN, и nginx видит один адрес прокси. Во втором случае настройте real_ip, чтобы nginx брал настоящий адрес посетителя.
Что будет, если весь офис ходит с одного IP?
Все сотрудники будут делить один лимит. Добавьте адрес офиса в белый список — генератор соберёт для этого блок geo.
Можно ли ограничить только POST-запросы?
Да. Генератор для форм делает ключ через map: у POST это адрес, у остальных запросов — пустая строка, а пустой ключ nginx не ограничивает.
Нужны ли лимиты, если есть антибот?
Да, они работают на разных уровнях. Лимиты дёшево отсекают грубый поток запросов до приложения, антибот разбирается с ботами, которые ведут себя как люди.