Jak rozwiązać błąd 429 „Zbyt wiele żądań”
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: 60To 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.confDostosuj:
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: 10W 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ą.


