{"id":2174,"date":"2026-08-26T08:19:00","date_gmt":"2026-08-26T07:19:00","guid":{"rendered":"https:\/\/jalvo.eu\/rate-limiting-botow-bez-spowalniania-googlebota\/"},"modified":"2026-09-25T00:16:55","modified_gmt":"2026-09-24T23:16:55","slug":"rate-limiting-botow-bez-spowalniania-googlebota","status":"publish","type":"post","link":"https:\/\/jalvo.eu\/pl\/rate-limiting-botow-bez-spowalniania-googlebota\/","title":{"rendered":"Rate limiting bot\u00f3w bez spowalniania Googlebota"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u017beby bezpiecznie ogranicza\u0107 boty, najpierw zweryfikuj Googlebota i wy\u0142\u0105cz go z limit\u00f3w, potem d\u0142awij ca\u0142\u0105 reszt\u0119 per IP przez nginx limit_req i zwracaj 429 Too Many Requests ka\u017cdemu klientowi, kt\u00f3ry przekroczy limit. To ca\u0142y przepis. Ten poradnik jest dla administrator\u00f3w, kt\u00f3rych serwer \u017ar\u00f3d\u0142owy zasypuj\u0105 scrapery i kt\u00f3rzy chc\u0105 je spowolni\u0107, nie trac\u0105c crawlowania przez wyszukiwark\u0119. Haczyk? Limit na\u0142o\u017cony na wszystkich \u0142apie te\u017c prawdziwego Googlebota. A fa\u0142szywe crawlery wysy\u0142aj\u0105 user agent Googlebota w\u0142a\u015bnie po to, \u017ceby prze\u015blizgn\u0105\u0107 si\u0119 przez twoje regu\u0142y, wi\u0119c sam ci\u0105g user agent niczego nie dowodzi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dlaczego limit dla wszystkich mo\u017ce zaszkodzi\u0107 crawlowaniu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Google odczytuje seri\u0119 odpowiedzi 429, 500 lub 503 jako \u201ezwolnij, prosz\u0119&#8221;, wi\u0119c limit, kt\u00f3ry \u0142apie Googlebota, obni\u017ca tempo crawlowania ca\u0142ej nazwy hosta. Nie tylko jednej \u015bcie\u017cki. Wed\u0142ug <a href=\"https:\/\/developers.google.com\/crawling\/docs\/crawlers-fetchers\/reduce-crawl-rate\" rel=\"nofollow noopener\" target=\"_blank\">poradnika Google o ograniczaniu crawlowania<\/a> spowolnienie obejmuje ca\u0142\u0105 nazw\u0119 hosta, na przyk\u0142ad subdomain.example.com. Rzadziej crawlowane s\u0105 wi\u0119c tak\u017ce adresy URL, kt\u00f3re zwracaj\u0105 zupe\u0142nie normaln\u0105 tre\u015b\u0107, razem z tymi, kt\u00f3re sypa\u0142y b\u0142\u0119dami. Crawlowanie samo wraca do normy, gdy b\u0142\u0119d\u00f3w ubywa. Moim zdaniem 429 wys\u0142ane do Googlebota ma by\u0107 narz\u0119dziem, po kt\u00f3re si\u0119gasz celowo, a nigdy skutkiem ubocznym regu\u0142y na scrapery.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jak zweryfikowa\u0107 Googlebota po IP, zanim wy\u0142\u0105czysz go z limit\u00f3w?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u017b\u0105danie naprawd\u0119 pochodzi od Googlebota tylko wtedy, gdy jego IP rozwi\u0105zuje si\u0119 na nazw\u0119 hosta Google, a ta nazwa rozwi\u0105zuje si\u0119 z powrotem na to samo IP, albo gdy IP mie\u015bci si\u0119 w opublikowanych przez Google zakresach crawler\u00f3w. Weryfikacja DNS w obie strony wygl\u0105da tak:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Wykonaj odwrotne zapytanie DNS (reverse DNS) dla IP, z kt\u00f3rego przysz\u0142o \u017c\u0105danie.<\/li>\n<li>Sprawd\u017a, czy domena to <strong>googlebot.com, google.com lub googleusercontent.com<\/strong>.<\/li>\n<li>Wykonaj zwyk\u0142e zapytanie DNS (forward DNS) dla otrzymanej nazwy hosta.<\/li>\n<li>Por\u00f3wnaj wynik z pierwotnym IP. Brak zgodno\u015bci oznacza, \u017ce to nie Google.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Nazwy host\u00f3w maj\u0105 wzorce w rodzaju crawl-***-***-***-***.googlebot.com lub geo-crawl-***-***-***-***.geo.googlebot.com, jak pokazuje <a href=\"https:\/\/developers.google.com\/crawling\/docs\/crawlers-fetchers\/verify-google-requests\" rel=\"nofollow noopener\" target=\"_blank\">instrukcja Google do weryfikacji crawler\u00f3w<\/a>. Wolisz zakresy ni\u017c DNS? Mo\u017cesz zamiast tego por\u00f3wnywa\u0107 IP z listami publikowanymi przez Google. Tylko od\u015bwie\u017caj je regularnie (wystarczy zadanie cron), zamiast wpisa\u0107 je na sztywno i o nich zapomnie\u0107. Je\u015bli odwrotna cz\u0119\u015b\u0107 sprawdzenia wydaje ci si\u0119 troch\u0119 mglista, tu wyja\u015bniamy, <a href=\"https:\/\/jalvo.eu\/reverse-dns-ptr-records-footprint-signal\/\">jak dzia\u0142aj\u0105 zapytania PTR<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Konfiguracja nginx limit_req dla niezweryfikowanych bot\u00f3w<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">nginx limit_req ogranicza \u017c\u0105dania wed\u0142ug klucza, a pusty klucz nigdy nie jest liczony, wi\u0119c zweryfikowane crawlery omijaj\u0105 limit, a wszyscy pozostali s\u0105 \u015bledzeni per IP. Ta drobna osobliwo\u015b\u0107 robi tu wi\u0119kszo\u015b\u0107 roboty. Minimalna konfiguracja ma cztery elementy: blok <em>geo<\/em>, kt\u00f3ry oznacza zweryfikowane zakresy Google, <em>map<\/em>, kt\u00f3ry zamienia t\u0119 flag\u0119 na pust\u0105 warto\u015b\u0107 albo <em>$binary_remote_addr<\/em>, <em>limit_req_zone<\/em> na tym kluczu oraz <em>limit_req<\/em> z burst i nodelay w bloku location.<\/p>\n\n\n\n<pre><code>geo $google_verified {\n    default 0;\n    include \/etc\/nginx\/google-ranges.conf;  # od\u015bwie\u017cane przez zadanie cron\n}\nmap $google_verified $limit_key {\n    1 \"\";\n    0 $binary_remote_addr;\n}\nlimit_req_zone $limit_key zone=bots:10m rate=YOUR_RATE;\n\nserver {\n    limit_req_status 429;\n    location \/ {\n        limit_req zone=bots burst=YOUR_BURST nodelay;\n    }\n}<\/code><\/pre>\n<p class=\"wp-block-paragraph\">Ustaw <strong>limit_req_status 429<\/strong>, \u017ceby d\u0142awieni klienci dostawali 429 Too Many Requests zamiast domy\u015blnego w nginx 503, i wysy\u0142aj razem z nim nag\u0142\u00f3wek Retry-After. Kosztowne \u015bcie\u017cki, takie jak wyszukiwarka, filtry i feedy, zas\u0142uguj\u0105 na osobn\u0105, cia\u015bniejsz\u0105 stref\u0119. Zasobom statycznym wystarczy lu\u017aniejsza. Te ustawienia dotycz\u0105 twojego w\u0142asnego serwera \u017ar\u00f3d\u0142owego lub serwera NGINX. A warto\u015bci limit\u00f3w? Zale\u017c\u0105 od twojego ruchu i sprz\u0119tu, wi\u0119c dostrajaj je na podstawie log\u00f3w. Kopiowanie liczb z przypadkowego wpisu na blogu (tego te\u017c) to prosta droga do d\u0142awienia prawdziwych u\u017cytkownik\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wy\u0142apywanie fa\u0142szywych Googlebot\u00f3w i agresywnych scraper\u00f3w<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wszystko, co w user agencie podaje si\u0119 za Googlebota, ale nie przechodzi weryfikacji DNS ani zakres\u00f3w IP, trafia do najostrzejszej strefy limit\u00f3w albo jest od razu blokowane. Bez drugiej szansy. W logu dost\u0119pu zdradzaj\u0105 to takie sygna\u0142y:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>user agent Googlebota z IP spoza Google,<\/li>\n<li>du\u017ca liczba \u017c\u0105da\u0144 z jednego IP lub jednej podsieci,<\/li>\n<li>crawlowanie adres\u00f3w z parametrami, takich jak warianty sortowania, filtr\u00f3w i sesji,<\/li>\n<li>ignorowanie robots.txt, kt\u00f3rego prawdziwe crawlery Google zawsze przestrzegaj\u0105 przy automatycznym crawlowaniu.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Trzymaj wyniki reverse DNS w cache, inaczej weryfikacja dok\u0142ada zapytanie do ka\u017cdego pojedynczego \u017c\u0105dania. S\u0142abo. Loguj te\u017c d\u0142awione \u017c\u0105dania do osobnego pliku, \u017ceby \u0142atwo wy\u0142apa\u0107 fa\u0142szywe alarmy. Do przegl\u0105dania tego pliku \u015bwietnie nadaje si\u0119 to samo podej\u015bcie, kt\u00f3rego u\u017cywamy do <a href=\"https:\/\/jalvo.eu\/reading-server-logs-crawl-problems\/\">weryfikacji Googlebota w logach<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Co si\u0119 zmienia, gdy ruch przechodzi przez reverse proxy z rotacj\u0105 IP?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Za reverse proxy serwer \u017ar\u00f3d\u0142owy widzi adres proxy zamiast adresu crawlera, wi\u0119c weryfikacja po IP i limity per IP na serwerze \u017ar\u00f3d\u0142owym przestaj\u0105 dzia\u0142a\u0107, chyba \u017ce prawdziwe IP klienta jest przekazywane dalej. Rotuj\u0105ce adresy proxy jeszcze to komplikuj\u0105. Jeden odwiedzaj\u0105cy mo\u017ce pojawi\u0107 si\u0119 pod kilkoma adresami, a wielu odwiedzaj\u0105cych mo\u017ce dzieli\u0107 jeden. Liczniki per IP si\u0119 rozje\u017cd\u017caj\u0105, a sprawdzenia reverse DNS trafiaj\u0105 w niew\u0142a\u015bciwy host. Rozwi\u0105zaniem jest nag\u0142\u00f3wek z przekazanym IP klienta plus lista zaufanych adres\u00f3w proxy, a dok\u0142adnie tym zajmuje si\u0119 modu\u0142 nginx real_ip. Tylko \u017ce weryfikacja jest dok\u0142adnie tak wiarygodna jak ten nag\u0142\u00f3wek. Je\u015bli tw\u00f3j ruch idzie przez <a href=\"https:\/\/jalvo.eu\/services\/\">reverse proxy z rotacj\u0105 IP<\/a>, sprawd\u017a, kt\u00f3ry adres faktycznie trafia do twoich stref limit\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Kiedy naprawd\u0119 trzeba zmniejszy\u0107 tempo crawlowania Googlebota<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli to sam Googlebot przeci\u0105\u017ca serwer, mo\u017cesz przez kr\u00f3tki czas zwraca\u0107 jego \u017c\u0105daniom 500, 503 lub 429, a Google b\u0119dzie crawlowa\u0107 mniej, dop\u00f3ki b\u0142\u0119dy nie ustan\u0105. Kluczowe s\u0142owo to \u201ekr\u00f3tki&#8221;. <a href=\"https:\/\/developers.google.com\/crawling\/docs\/crawlers-fetchers\/reduce-crawl-rate\" rel=\"nofollow noopener\" target=\"_blank\">Dokumentacja Google o tempie crawlowania<\/a> opisuje to jako dora\u017any \u015brodek na kr\u00f3tki okres, na przyk\u0142ad par\u0119 godzin albo 1-2 dni. Nie mo\u017cesz serwowa\u0107 b\u0142\u0119d\u00f3w? Wtedy mo\u017cesz z\u0142o\u017cy\u0107 specjalne zg\u0142oszenie o nietypowo wysokim tempie crawlowania. Nie pr\u00f3buj w ten spos\u00f3b prosi\u0107 o wy\u017csze tempo, bo nie do tego s\u0142u\u017cy, a jego rozpatrzenie i tak mo\u017ce potrwa\u0107 kilka dni. Tak czy inaczej, to celowe i ograniczone w czasie spowolnienie. Trzymaj je osobno od opisanych wy\u017cej limit\u00f3w na scrapery.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Kolejno\u015b\u0107 ma tu znaczenie: zweryfikuj Googlebota, wy\u0142\u0105cz go z limit\u00f3w, klient\u00f3w, kt\u00f3rzy nie przeszli weryfikacji, d\u0142awij przez limit_req i 429, a potem pilnuj log\u00f3w pod k\u0105tem pomy\u0142ek. Za proxy z rotuj\u0105cymi adresami logika per IP na serwerze \u017ar\u00f3d\u0142owym jest dok\u0142adnie tak dobra jak przekazane IP klienta. Je\u015bli chcesz wej\u015b\u0107 g\u0142\u0119biej, wi\u0119cej znajdziesz w naszych <a href=\"https:\/\/jalvo.eu\/category\/seo\/\">wpisach o crawlowaniu i indeksowaniu<\/a>. Ograniczaj boty w ten spos\u00f3b, a scrapery zwolni\u0105 do \u017c\u00f3\u0142wiego tempa, podczas gdy crawlowanie przez wyszukiwark\u0119 zachowa normalny rytm.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FAQ<\/h2>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-1790291448228-0\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Czy zwracanie 429 szkodzi pozycjom w Google?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>u003cpu003eDokumentacja Google m\u00f3wi o crawlowaniu, nie o pozycjach. Gdy Google widzi du\u017co b\u0142\u0119d\u00f3w 429, 500 lub 503, spowalnia crawlowanie ca\u0142ej nazwy hosta, a potem zn\u00f3w przyspiesza, gdy b\u0142\u0119d\u00f3w ubywa. Dlatego ka\u017cde 429 kierowane do Googlebota niech b\u0119dzie kr\u00f3tkie i celowe.u003c\/pu003e<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1790291448228-1\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Czy mo\u017cna ufa\u0107 user agentowi Googlebota?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>u003cpu003eNie. \u0141atwo go podrobi\u0107. Potwierd\u017a go odwrotnym zapytaniem DNS i zwyk\u0142ym zapytaniem DNS albo sprawd\u017a IP w opublikowanych przez Google zakresach crawler\u00f3w.u003c\/pu003e<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1790291448228-2\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Czy w og\u00f3le ogranicza\u0107 Googlebota w nginx?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>u003cpu003eZwykle nie. Wy\u0142\u0105cz zweryfikowane crawlery z limit\u00f3w. Zwracaj Google 429 lub 503 tylko celowo i tylko na kr\u00f3tko, gdy jego crawlowanie faktycznie przeci\u0105\u017ca serwer.u003c\/pu003e<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>\u017beby bezpiecznie ogranicza\u0107 boty, najpierw zweryfikuj Googlebota i wy\u0142\u0105cz go z limit\u00f3w, potem d\u0142awij ca\u0142\u0105 reszt\u0119 per IP przez nginx [&hellip;]<\/p>\n","protected":false},"author":25,"featured_media":2156,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[182],"tags":[],"class_list":["post-2174","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-seo-pl"],"acf":[],"_links":{"self":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts\/2174","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/users\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/comments?post=2174"}],"version-history":[{"count":1,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts\/2174\/revisions"}],"predecessor-version":[{"id":2184,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts\/2174\/revisions\/2184"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/media\/2156"}],"wp:attachment":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/media?parent=2174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/categories?post=2174"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/tags?post=2174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}