Как устранить ошибку 429 “Слишком много запросов”

Ошибка HTTP 429 “Too Many Requests” – это код ответа с ограничением скорости, отправляемый сервером, когда пользователь (или клиент) превышает количество разрешенных запросов в течение заданного периода времени. Этот статус обычно является частью механизмов безопасности, защиты API или защиты от DDoS.

В производственных средах он может прерывать работу сервисов, нарушать интеграцию API или влиять на SEO. В этом продвинутом руководстве рассказывается о том, как диагностировать, предотвратить и устранить ошибку 429 как со стороны клиента, так и со стороны сервера.

Что вызывает ошибку 429?

Распространенные сценарии:

  • Пользователь/бот отправляет слишком много HTTP-запросов (вызовы API, загрузка страниц и т. д.)

  • Ваше приложение слишком активно использует сторонние сервисы для скраппинга или опроса

  • Брандмауэры веб-приложений (WAF) или обратные прокси (например, Cloudflare, Nginx) устанавливают ограничения скорости

  • Серверные или внутренние API-интерфейсы используют библиотеки ограничения скорости (например, express-rate-limit, mod_evasive и т. д.)

  • Боты или краулеры наводняют веб-сайт или конечную точку

Шаг 1: Определите источник

✅ 1. Проверьте заголовки ответа

Серверы часто отправляют заголовок Retry-After вместе с ответом 429:

HTTP/1.1 429 Too Many Requests
Retry-After: 60

Это указывает клиенту, сколько времени нужно подождать (в секундах) перед повторной попыткой.

✅ 2. Проверьте журналы доступа

Для Apache:

cat /var/log/apache2/access.log | grep "429"

Для Nginx:

cat /var/log/nginx/access.log | grep "429"

Это поможет определить, на каких IP-адресах или конечных точках срабатывает ограничение.

✅ 3. Использование инструментов мониторинга

  • Журналы Fail2Ban

  • События брандмауэра Cloudflare

  • Журналы на уровне приложений (Laravel, Express, Django и т. д.)

  • Аналитика ограничения скорости (при использовании API-шлюза)

Шаг 2: Исправления на стороне сервера

A. Ограничение скорости в Nginx (если оно включено)

Nginx может быть настроен следующим образом:

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

location /api/ {
limit_req zone=api_limit burst=10 nodelay;
}

Решение:

  • Увеличьте скорость или скорость передачи данных

  • Применять к определенным путям (например, /api/), а не глобально

  • Занести в белый список известные внутренние IP-адреса

B. Apache (mod_evasive или mod_security)

Если mod_evasive активен:

sudo nano /etc/apache2/mods-enabled/evasive.conf

Настроить:

DOSPageCount 10
DOSSiteCount 100
DOSBlockingPeriod 10

➡️ Увеличьте пороговые значения или отключите их для определенных доверенных IP-адресов.

C. Правила Cloudflare / CDN

Если вы используете Cloudflare, проверьте:

  • Правила ограничения скорости в разделе Безопасность > WAF

  • Режим борьбы с ботами

  • Правила брандмауэра, блокирующие на основе User-Agent или IP

Решение:

  • Снизить чувствительность

  • Внесите в белый список IP-адреса серверов или определенные пользовательские агенты

  • Создайте пользовательские правила для безопасных краулеров и партнеров

D. Ограничение скорости на уровне приложения

Проверьте, применяет ли ваше приложение ограничения с помощью таких библиотек, как:

  • Node.js: express-rate-limit

  • Laravel: ThrottleRequests

  • Django: drf-extensions или middleware

Обновите конфигурацию, например:

rateLimit({
windowMs: 1 * 60 * 1000, // 1 минута
max: 100, // ограничение каждого IP до 100 запросов в минуту
})

➡️ Настройте лимиты, добавьте белые списки пользователей/IP или увеличьте квоту на основе маркеров доступа.

Шаг 3: Исправления на стороне клиента (при использовании API)

Если ваше приложение является клиентом и получает 429s:

✅ Реализуйте экспоненциальный откат

Автоматическое повторение запросов с увеличивающейся задержкой:

const retryAfter = (attempt) => Math.pow(2, attempt) * 1000;

✅ Соблюдайте заголовки Retry-After

if (response.status === 429) {
const wait = response.headers['retry-after'] * 1000;
setTimeout(() => retryRequest(), wait);
}

✅ Добавьте ограничение скорости в клиент

При опросе дросселируйте собственные запросы:

// Используйте lodash или пользовательское дросселирование
_.throttle(() => fetchData(), 1000);

Шаг 4: SEO-соображения

Статус 429, передаваемый поисковикам, может повредить вашему рейтингу.

✅ Решение:

  • Вместо этого отправляйте 503 (Service Unavailable) с Retry-After

  • Используйте robots.txt, чтобы ограничить скорость переползания:

    User-agent: *
    Crawl-delay: 10
  • В Cloudflare: Перейдите в раздел Боты > Управление ползанием

Шаг 5: Защита без блокировки законных пользователей

Вместо жестких ограничений 429:

  • Используйте CAPTCHA для подозрительной активности

  • Внедряйте прогрессивные задержки вместо жесткой блокировки

  • Используйте ограничение скорости на основе пользователя, а не IP-адреса для вошедших в систему пользователей

  • Предоставляйте аутентифицированный доступ с более высокими ограничениями скорости (например, с помощью API-ключей или токенов)

Заключение

Ошибка 429 Too Many Requests – полезный, но иногда разрушительный инструмент. Понимание того, откуда она исходит – от сервера, CDN или приложения, – является ключом к ее устранению. При правильной настройке, ведении журнала и соблюдении лимитов на стороне клиента вы сможете сбалансировать защиту и удобство использования.