Jak rozwiązać błąd 429 „Za dużo żądań”

Błąd HTTP 429 „Za dużo żądań” to kod odpowiedzi ograniczający liczbę żądań, wysyłany przez serwer, gdy użytkownik (lub klient) przekracza dozwoloną liczbę żądań w danym czasie. Ten status zazwyczaj jest częścią mechanizmów bezpieczeństwa, ochrony API lub przeciwdziałania DDoS.

W środowiskach produkcyjnych może przerywać usługi, łamać integracje API lub wpływać na SEO. Ten zaawansowany przewodnik opisuje, jak diagnozować, zapobiegać i rozwiązywać błąd 429 z perspektywy klienta i serwera.

 Co powoduje błąd 429?

Typowe scenariusze:

  • Użytkownik/bot wysyła zbyt wiele żądań HTTP (wywołań API, ładowań stron itp.)

  • Twoja aplikacja zbyt agresywnie skanuje lub pobiera dane z usługi zewnętrznej

  • Zapory aplikacji webowych (WAF) lub proxy odwrotne (np. Cloudflare, Nginx) egzekwują limity szybkości

  • Serwery lub API backendowe korzystają z bibliotek ograniczających liczbę żądań (np. express-rate-limit, mod_evasive itp.)

  • Boty lub skrypty zalewają stronę internetową lub punkt końcowy

 Krok 1: Zidentyfikuj źródło

✅ 1. Sprawdź nagłówki odpowiedzi

Serwery często wysyłają nagłówek Retry-After z odpowiedzią 429:

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

To informuje klienta, jak długo czekać (w sekundach) przed ponownym spróbowaniem.

✅ 2. Sprawdź logi dostępu

Dla Apache:

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

Dla Nginx:

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

To pomaga zidentyfikować, które adresy IP lub punkty końcowe wywołują limit.

✅ 3. Użyj narzędzi monitorujących

  • Logi Fail2Ban

  • Wydarzenia zapory Cloudflare

  • Logi na poziomie aplikacji (Laravel, Express, Django itp.)

  • Analiza limitów szybkości (jeśli korzystasz z bramy API)

 Krok 2: Poprawki po stronie serwera

 A. Ograniczanie szybkości Nginx (jeśli włączone)

Nginx może być skonfigurowany w ten sposób:

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

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

Rozwiązanie:

  • Zwiększ rate lub burst

  • Zastosuj do konkretnych ścieżek (np. /api/) zamiast globalnie

  • Dodaj do białej listy znane wewnętrzne adresy IP

 B. Apache (mod_evasive lub mod_security)

Jeśli mod_evasive jest aktywny:

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

Dostosuj:

DOSPageCount 10
DOSSiteCount 100
DOSBlockingPeriod 10

➡️ Zwiększ progi lub wyłącz dla zaufanych adresów IP.

 C. Reguły Cloudflare / CDN

Jeśli jesteś za Cloudflare, sprawdź:

  • Reguły ograniczania szybkości w Bezpieczeństwo > WAF

  • Tryb walki z botami

  • Reguły zapory blokujące na podstawie User-Agent lub IP

Rozwiązanie:

  • Obniż czułość

  • Dodaj do białej listy adresy IP serwera lub niektóre agenty użytkownika

  • Utwórz niestandardowe reguły dla bezpiecznych skryptów i partnerów

D. Ograniczanie szybkości na poziomie aplikacji

Sprawdź, czy Twoja aplikacja egzekwuje limity za pomocą bibliotek takich jak:

  • Node.js: express-rate-limit

  • Laravel: ThrottleRequests

  • Django: drf-extensions lub middleware

Zaktualizuj konfigurację, taką jak:

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

➡️ Dostosuj limity, dodaj białą listę użytkowników/IP lub zwiększ limit na podstawie tokenów autoryzacyjnych.

 Krok 3: Poprawki po stronie klienta (podczas korzystania z API)

Jeśli Twoja aplikacja jest klientem i otrzymuje 429:

✅ Wprowadź wykładnicze opóźnienie

Automatycznie powtarzaj żądania z rosnącymi opóźnieniami:

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

✅ Szanuj nagłówki Retry-After

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

✅ Dodaj ograniczenie szybkości do klienta

Ograniczaj własne żądania, jeśli skanujesz:

// Use lodash or custom throttling
_.throttle(() => fetchData(), 1000);

Krok 4: Rozważania SEO

Status 429 wysyłany do skryptów wyszukiwarek może zaszkodzić Twoim rankingom.

✅ Rozwiązanie:

  • Zamiast tego serwuj 503 (Usługa niedostępna) z Retry-After

  • Użyj robots.txt, aby ograniczyć szybkość skanowania:

    User-agent: *
    Crawl-delay: 10
  • W Cloudflare: Przejdź do Boty > Zarządzanie skanowaniem

 Krok 5: Ochrona bez blokowania legalnych użytkowników

Zamiast surowych limitów 429:

  • Użyj CAPTCHA w przypadku podejrzanej aktywności

  • Wprowadź progresywne opóźnienia zamiast twardego blokowania

  • Użyj ograniczeń opartych na użytkownikach zamiast opartych na IP dla zalogowanych użytkowników

  • Zapewnij uwierzytelniony dostęp z wyższymi limitami (np. za pomocą kluczy API lub tokenów)

 Podsumowanie

Błąd 429 Za dużo żądań jest użytecznym, ale czasami zakłócającym narzędziem. Zrozumienie, skąd pochodzi—serwer, CDN czy aplikacja—jest kluczowe dla jego rozwiązania. Dzięki odpowiedniej konfiguracji, logowaniu i poszanowaniu limitów po stronie klienta, możesz zrównoważyć ochronę z użytecznością.