Błąd 429 Too Many Requests: który limit blokuje odwiedzających
· 6 min czytania
Co oznacza ten błąd
429 to odpowiedź „za dużo żądań w za krótkim czasie, spróbuj później”. Wysyła ją limit zapytań (rate limiting), ustawiony gdzieś między odwiedzającym a aplikacją: w CDN, na serwerze WWW, we wtyczce albo w samej aplikacji. Odpowiedź ma często nagłówek Retry-After z liczbą sekund do odczekania. W odróżnieniu od błędu 503 serwer nie jest przeciążony; ktoś celowo ustawił próg i został przekroczony.
Jeśli 429 dostajesz od cudzej usługi albo API, sprawa jest prosta: wysyłasz za dużo, zwolnij, dodaj pauzy między żądaniami i honoruj Retry-After. Ten poradnik zajmuje się drugim przypadkiem: 429 na Twojej własnej stronie, który dostają zwykli odwiedzający, Twoje własne narzędzia albo Ty.
Częste przyczyny
- Limit u dostawcy hostingu. Hosting współdzielony ogranicza liczbę żądań na sekundę, równoległych połączeń albo „entry processes” na konto; po przekroczeniu brama odpowiada 429 (albo 503).
- Cloudflare Rate Limiting albo WAF. Reguła „więcej niż X żądań na minutę z jednego adresu”, Bot Fight Mode albo wyzwanie, które blokuje też legalne skrypty i aplikacje.
- Wtyczka bezpieczeństwa WordPressa. Limit na
wp-login.php,xmlrpc.phpi REST API; po kilku nieudanych logowaniach (także Twoich) blokuje adres na godziny. limit_reqw nginx ustawione zbyt nisko albo bezburst, więc jedna strona z dwudziestoma obrazkami już przekracza próg.mod_evasivealbomod_qosw Apache z domyślnymi, ostrymi progami.- Boty i scrapery, które wyczerpują limit współdzielony dla całej strony, przez co cierpią prawdziwi odwiedzający.
- Własny monitoring albo integracje (sklep, CRM, narzędzie SEO), które odpytują stronę częściej, niż pozwala limit.
- Limit w aplikacji: Laravel
throttle, WooCommerce REST, wtyczki API.
Nasz bot sprawdza Twoją stronę jednym zapytaniem na sprawdzenie i nie crawluje; jeśli widzisz go w logach, zobacz co robi bot Centoculus.
Jeśli odwiedzasz cudzą stronę
- Odczekaj czas z
Retry-After(zwykle minutę do kilku minut) i odśwież raz, nie dziesięć razy. - Jeśli używasz VPN albo sieci firmowej, wychodzisz z tego samego adresu co setki innych osób; spróbuj z innej sieci.
- Wyłącz rozszerzenia, które odpytują stronę w tle (podglądy, tłumacze, blokery z filtrami zdalnymi).
Jeśli to Twoja strona: najpierw sprawdź
Narzędzie Is it down? pokaże, czy 429 dostaje także neutralny adres z jednym żądaniem; jeśli tak, limit jest ustawiony absurdalnie nisko albo liczony dla całej strony, nie na adres. Potem ustal, kto odpowiada:
curl -sI https://przyklad.pl/ | grep -iE '^(HTTP|server|retry-after|cf-ray|x-ratelimit)'
server: cloudflare z cf-ray wskazuje Cloudflare, x-ratelimit-* aplikację, Retry-After bez innych śladów serwer WWW albo dostawcę. Na serwerze:
# nginx: „limiting requests, excess: …”
sudo grep -n 'limiting requests' /var/log/nginx/error.log | tail -n 20
# kto generuje najwięcej żądań?
sudo tail -n 20000 /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head
sudo tail -n 20000 /var/log/nginx/access.log | awk -F'"' '{print $6}' | sort | uniq -c | sort -rn | head
# Apache mod_evasive
sudo grep -n 'client denied\|mod_evasive' /var/log/apache2/error.log | tail -n 20
Jeśli na szczycie listy jest jeden adres z tysiącami żądań, limit działa poprawnie i wystarczy zablokować źródło. Jeśli na szczycie są zwykłe przeglądarki, próg jest za niski.
Naprawy na własnym serwerze albo hostingu z SSH
1. nginx: rozsądny limit z buforem
limit_req_zone $binary_remote_addr zone=site:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
server {
location / {
limit_req zone=site burst=40 nodelay;
}
location = /wp-login.php {
limit_req zone=login burst=5 nodelay;
}
}
burst pozwala na krótkie serie (strona z wieloma zasobami), nodelay nie opóźnia ich sztucznie. Osobna, ostra strefa tylko dla logowania. Potem sudo nginx -t && sudo systemctl reload nginx.
2. Apache: mod_evasive
W /etc/apache2/mods-enabled/evasive.conf podnieś DOSPageCount i DOSSiteCount (np. 10 i 150 na sekundę) i dodaj DOSWhitelist dla własnych adresów i narzędzi. sudo apachectl configtest && sudo systemctl reload apache2.
3. Cloudflare
Security → WAF → Rate limiting rules: podnieś próg albo zawęź regułę do ścieżek, które naprawdę trzeba chronić (/wp-login.php, /xmlrpc.php, /api/). W Security → Events zobaczysz, która reguła odpowiada 429, i dodasz wyjątek dla swoich adresów i integracji.
4. Wtyczka bezpieczeństwa WordPressa
wp plugin list --status=active
wp plugin deactivate limit-login-attempts-reloaded
Po potwierdzeniu, że to wtyczka, włącz ją ponownie i podnieś progi albo dodaj swój adres do listy dozwolonych. Jeśli nie używasz xmlrpc.php, wyłącz go całkiem zamiast limitować: add_filter('xmlrpc_enabled', '__return_false'); w motywie potomnym albo blokada w nginx.
5. Zablokuj boty, zamiast karać wszystkich
sudo ufw deny from 203.0.113.45
sudo nft add rule inet filter input ip saddr 203.0.113.45 drop
W nginx odrzuć agresywne user agenty mapą (map $http_user_agent $bad_bot { ... }) i return 403 dla nich. Dla dużych crawlerów SEO ustaw Crawl-delay w robots.txt; część go honoruje.
6. Własne integracje
Sprawdź, jak często Twój sklep, CRM albo narzędzie SEO odpytują stronę, i rozłóż to w czasie. Dodaj ich adresy do listy wyjątków limitu (w nginx geo $limit { default 1; 198.51.100.0/24 0; } plus map $limit $limit_key { 0 ""; 1 $binary_remote_addr; } i limit_req_zone $limit_key …; pusty klucz nie jest limitowany).
Gdy to problem dostawcy hostingu
Na hostingu współdzielonym limitów dostawcy nie zmienisz. Wyślij:
Dzień dobry, moja strona przyklad.pl odpowiada „429 Too Many Requests” od około 14:00 UTC także dla pojedynczych żądań ze sprawdzenia z zewnątrz. Nie mam własnego limitu zapytań, po mojej stronie nic się nie zmieniło. Który limit mojego konta został przekroczony (żądania na sekundę, procesy, połączenia), od kiedy i przez jakie adresy? Czy można go podnieść albo dopasować do ruchu strony?
Jeśli odpowiedź brzmi „taki jest plan”, rozważ cache (strona z cache nie liczy się jako proces PHP) albo plan z wyższym limitem.
Jak zapobiec następnemu
Limit zapytań ma chronić przed botami, nie przed klientami. Sprawdzanie HTTP w monitoringu stron wysyła alert przy kodzie 429 w ciągu minut, a sprawdzanie koszyka albo logowania jako osobny monitor pokaże, czy blokada dotyka ścieżek, na których zarabiasz. Awaria? Naprawiamy: Quick Fix poprawia drobne błędy konfiguracji po teście, z kopią zapasową, w stałej cenie; reguły limitów w nginx, Apache, Cloudflare i we wtyczkach porządkuje Deep Fix. Zobacz naprawa serwera i naprawa WordPressa na żądanie. Pokrewny błąd, gdy blokuje reguła bezpieczeństwa: błąd 403 Forbidden.
Co teraz
Sprawdź z zewnątrz
Strona nie działa u wszystkich czy tylko u Ciebie i co odpowiada serwer? Za darmo, bez rejestracji.
Is it down? Sprawdź, czy strona działaAwaria? Naprawiamy.
Na Twoim własnym serwerze albo na hostingu z dostępem SSH: Quick Fix w stałej cenie na częste przyczyny, Deep Fix rozliczany w blokach po 15 minut na resztę, przez całą dobę. Cena przed zamówieniem.
Zamów naprawęWięcej poradników
- Strona nie działa: co zrobić w pierwszych 15 minutach
- Awaria serwera: co sprawdzić i w jakiej kolejności
- Błąd 500 Internal Server Error: znajdź przyczynę w logach i przywróć stronę
- Błąd 502 Bad Gateway: znajdź przyczynę i napraw
- Błąd 503: przeciążenie, konserwacja czy limit hostingu?
- Błąd 504 Gateway Timeout: znajdź, co spowalnia stronę
- Błąd 521 i 522 w Cloudflare: serwer źródłowy nie odpowiada
- DNS_PROBE_FINISHED_NXDOMAIN: domena przestała odpowiadać
- ERR_CONNECTION_REFUSED: serwer odrzuca połączenie
- ERR_CONNECTION_TIMED_OUT: serwer nie odpowiada na czas
- Co oznacza „Połączenie nie jest prywatne” i jak to naprawić
- ERR_SSL_PROTOCOL_ERROR: bezpieczne połączenie zawodzi przed certyfikatem
- ERR_TOO_MANY_REDIRECTS: znajdź pętlę przekierowań i ją przerwij
- Błąd 403 Forbidden: co blokuje dostęp do Twojej strony
- ERR_NAME_NOT_RESOLVED: nie można znaleźć nazwy strony
- „Błąd podczas nawiązywania połączenia z bazą danych” w WordPressie: przyczyna i naprawa
- ERR_CONNECTION_RESET: dlaczego połączenie zrywa się w połowie
- ERR_EMPTY_RESPONSE: serwer nie wysłał żadnych danych
- Błąd krytyczny WordPress: znajdź przyczynę i przywróć stronę