Як усунути помилку 429 “Занадто багато запитів”

Помилка HTTP 429 “Занадто багато запи тів” – це код відповіді з обмеженням швидкості, який надсилається сервером, коли користувач (або клієнт) перевищує кількість дозволених запитів за певний проміжок часу. Цей статус зазвичай є частиною механізмів безпеки, захисту 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;
}

Рішення:

  • Збільшити швидкість або burst

  • Застосовувати до конкретних шляхів (наприклад, /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-розширення або проміжне програмне забезпечення

Оновіть конфігурацію, наприклад:

rateLimit({
windowMs: 1 * 60 * 1000, // 1 minute
max: 100, // limit each IP to 100 requests per minute
})

➡️ Налаштуйте ліміти, додайте користувачів/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 (послуга недоступна) з функцією повторної спроби

  • Використовуйте robots.txt для обмеження швидкості сканування:

    User-agent: *
    Crawl-delay: 10
  • У Cloudflare: Перейдіть до Боти > Керування скануванням

Крок 5: Захистіть, не блокуючи законних користувачів

Замість суворих 429 обмежень:

  • Використовуйте CAPTCHA для підозрілої активності

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

  • Використовуйте обмеження швидкості на основі користувача, а не на основі IP-адреси для зареєстрованих користувачів

  • Надавати аутентифікований доступ з більш високими обмеженнями швидкості (наприклад, за допомогою ключів API або токенів)

Висновок

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