Ошибка 429 Too Many Requests: что означает и как исправить
5 мин чтения
Ошибка 429 Too Many Requests: что означает и как исправить

Ошибка 429 Too Many Requests: что означает и как исправить

429 — «слишком много запросов»: вы (или кто-то с вашего адреса) стучитесь чаще, чем сервер готов терпеть. Это не поломка, а работа ограничителя — rate limit. Интересна эта ошибка в первую очередь владельцам сайтов: неправильно настроенный лимит банит не парсеров, а живых покупателей, поисковых роботов и собственный мониторинг. Разбираем обе стороны и правила настройки лимитов без самострела.

Как работает rate limit

Ограничитель считает запросы по какому-то признаку — обычно по IP-адресу, иногда по токену или аккаунту — и, когда частота превышает порог (скажем, 10 запросов в секунду), начинает отвечать 429 вместо содержимого. Хорошо воспитанный сервер добавляет заголовок Retry-After: через сколько секунд можно возвращаться. Лимиты стоят почти везде: у API (у каждого сервиса свои квоты), у защит от перебора паролей, у анти-бот систем и CDN. Так что встреча с 429 — вопрос времени для любого, кто автоматизирует работу с вебом.

Если вы посетитель или разработчик клиента

Живой человек ловит 429 в двух случаях. Первый — общий адрес: вы в офисной сети, за CGNAT мобильного оператора или за VPN, и лимит исчерпали «соседи» по IP; лечится сменой сети или ожиданием. Второй — вы действительно частите: обновляете страницу как дятел, открыли двадцать вкладок одного сайта, запустили расширение-качалку. Подождите время из Retry-After (или пару минут, если заголовка нет) — и всё вернётся.

Разработчику клиента API правило одно, зато железное: уважать 429. Экспоненциальная пауза между повторами (1 → 2 → 4 → 8 секунд), чтение Retry-After, кэширование ответов, батчи вместо очередей одиночных запросов. Клиент, который в ответ на 429 просто ретраит без паузы, устраивает сам себе DDoS и рано или поздно переезжает из «лимитированных» в «забаненные».

Если вы владелец: лимит, который бьёт по своим

Rate limit — необходимая защита: без него боты и парсеры выедают ресурсы, а перебор паролей идёт со скоростью канала. Но у неправильного лимита есть три любимые жертвы, и все три — ваши:

Жертва Почему попадает под лимит Последствие
Посетители за общим IP Офисы, кампусы, CGNAT операторов: сотни людей = один адрес 429 у реальных покупателей в час пик
Поисковые роботы Обходят сайт пачками запросов по расписанию Замедление индексации; при систематических 429 — деградация в поиске
Собственный мониторинг и вебхуки Регулярные автоматические запросы с постоянных адресов Ложные тревоги; потерянные уведомления платёжных систем

Рецепт без самострела: лимиты — по путям, а не «одним куском» (форма логина — жёстко, каталог — мягко, статика — вообще без лимита); всплеск (burst) — разрешён, чтобы нормальная страница с десятком ресурсов не считалась атакой; белые списки — для официальных диапазонов поисковиков и адресов своего мониторинга; и обязательно Retry-After в ответе, чтобы корректные клиенты знали, когда вернуться. И главное — смотрите в логи: кто реально ловит ваши 429. Если там пользовательские User-Agent из России — лимит настроен против собственных клиентов.

Как это выглядит в конфиге nginx — минимальный лимит на форму логина, не задевающий остальной сайт:

limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;

location = /login {
    limit_req zone=login burst=3;
    limit_req_status 429;    # по умолчанию nginx отдаёт 503 — явно ставим честный код
    ...
}

Обратите внимание на последнюю директиву: nginx исторически отвечает на превышение лимита кодом 503, что путает диагностику — перегрузка и лимит выглядят одинаково. Явный 429 разводит эти ситуации и в логах, и для клиентов. Параметр burst разрешает короткий всплеск (человек трижды ошибся паролем подряд — это не атака), а rate=5r/m держит перебор паролей на скорости, при которой он бессмыслен.

429 и SEO: медленное удушение

Поисковый робот, регулярно получающий 429, ведёт себя вежливо: снижает частоту обхода. Звучит безобидно, но на практике это значит, что новые страницы попадают в индекс неделями, а обновления цен и наличия поисковик видит с большим опозданием. Сайт «работает», позиции ползут вниз — и связать одно с другим без анализа логов почти невозможно.

429 от внешних API: планируйте квоты

Вторая жизнь этой ошибки — в интеграциях: ваш сайт сам ходит в чужие API (платёжки, карты, доставки, маркетплейсы), и у каждого — квоты. Пока запросов мало, о лимитах никто не думает; потом каталог вырастает, синхронизация начинает упираться в квоту, и обновление остатков молча останавливается на середине. Правила выживания: знать квоты каждого API, на который завязан бизнес; закладывать паузы и батчи в синхронизации заранее, а не после первого инцидента; и мониторить результат синхронизаций, а не только их запуск — «запустилась и умерла на 429» внешне неотличима от «отработала».

Как это устроено в Пруфене

Пруфен проверяет сайт с разумной частотой — интервал вы выбираете сами, от 2 минут — и с постоянных адресов, опубликованных на странице серверов мониторинга: внесите их в белый список, и лимиты не будут воевать с проверками. А если сайт начал отдавать 429 реальным посетителям, HTTP-проверки из 13 точек это заметят — особенно характерна картина «зелёное ночью, красное в часы пик».

Частые вопросы

Сколько ждать при 429? Сколько сказано в заголовке Retry-After; если его нет — начните с пары минут. Агрессивные повторы без пауз только продлевают бан.

Почему я получаю 429, хотя почти не пользуюсь сайтом? Лимит считается по адресу, а не по человеку: за общим IP (офис, мобильный оператор, VPN) квоту исчерпывают соседи. Смените сеть — и лимит «обнулится».

Чем 429 отличается от 503 при перегрузке? 429 — персональный отказ конкретному источнику за частоту («вы частите»), 503 — общий отказ из-за нехватки ресурсов («мне плохо»). Первый — работа защиты, второй — симптом перегрузки.

Нужен ли rate limit небольшому сайту? Минимальный — да, хотя бы на форму входа и поиск: перебор паролей и тупые парсеры приходят на сайты любого размера. Просто настройте его по путям и с белыми списками, а не «10 запросов в минуту на всё».

Была ли статья полезна?

Начните мониторинг прямо сейчас

Бесплатный тариф — до 5 проверок. 150 ₽ на баланс при регистрации.

Создать аккаунт