Sobota odpoledne. Přijde e-mail od hostingu s varováním, že váš účet je už hodiny na 100 % CPU. Otevřete statistiky a čekáte příval zákazníků, a najdete opak: čtyřicet tisíc zobrazení stránek a nula objednávek.
Není to útok, rozbitý modul ani váš e-shop, který dělá něco divného. Někdo začal procházet úplně všechny filtry ve vašem katalogu, jeden po druhém.
Co se doopravdy děje?
Váš e-shop má fasetové vyhledávání: velikost, barva, značka, cena, dostupnost a navrch řazení. Díky tomu se v něm pohodlně hledá.
Problém je, že každá kombinace těch filtrů je jiná webová adresa. Velikost M v modré od jedné značky seřazená podle ceny je jedna. Velikost M v modré od té značky seřazená od nejnovějších je další. A tak dál přes všechny možné kombinace: ve středně velkém e-shopu jich jsou stovky tisíc, ve velkém miliony.
Roboti sociálních sítí a služeb umělé inteligence – Facebooku, TikToku, půl tuctu firem, o kterých jste nikdy neslyšeli – usoudili, že je potřebují vidět všechny. A říkají si o všechny, najednou, bez přestávky.
Žádná z těch adres není stránka, kterou máte uloženou: každá je nové hledání ve vaší databázi.
Modul, který za tím stojí: Fasetové vyhledávání v PrestaShopu
Filtry vašeho e-shopu vykresluje jeden konkrétní modul, Fasetové vyhledávání (ps_facetedsearch), který je součástí PrestaShopu od verze 1.7 a nahradil starou Layered navigation. Pokud máte na stránkách kategorií filtry, máte ho zapnutý.
V logu se pozná snadno: každá kombinace cestuje v parametru q adresy a vypadá takhle.
/12-tshirts?q=Size-M/Colour-Blue/Brand-Adidas
Pokud váš přístupový log ukazuje tisíce řádků s ?q=, všechny různé a jeden za druhým, víte, co vám žere stroj.
A proč je to tak drahé? Když takový požadavek přijde, modul nehledá jen produkty, které odpovídají filtru: zároveň přepočítává počítadla všech ostatních filtrů – to „Modrá (12)“, „Zelená (5)“ vedle každého zaškrtávacího políčka – a spouští k tomu několik počítacích dotazů do svých indexových tabulek. Vynásobte to velkým katalogem a tisíci požadavků za minutu.
Dvě páky, které jsou přímo v modulu a na které skoro nikdo nesahá, v Moduly → Správce modulů → Fasetová navigace:
- Vypněte počet produktů vedle každého filtru. Je to nejdražší část každého požadavku a ve většině e-shopů ta, která nikomu nechybí.
- Projděte šablony filtrů pro jednotlivé kategorie. Každý filtr, který necháte, násobí možné kombinace. Osm filtrů v kategorii není osm adres: jsou to tisíce.
Ani jedna páka problém sama nevyřeší, ale obě sníží cenu každého požadavku dřív, než sáhnete na cokoli jiného.
Proč to tolik bolí?
Filtrované hledání je jedna z nejdražších věcí, které e-shop dělá: musí projít celý katalog, porovnat vlastnosti, spočítat, kolik produktů zbývá pod každým filtrem, a seřadit výsledek. Zákazník jich za celou návštěvu udělá tři čtyři. Robot tři čtyři za sekundu.
A tady je ta část, která všechny zaskočí: mezipaměť vás nezachrání. Mezipaměť pomáhá, když hodně návštěvníků chce totéž. Tady se nic neopakuje: každá kombinace je jedinečná, takže všechny jsou „první návštěva“ a všechny jdou až do databáze.
Výsledek je vždycky stejný. Požadavky se hromadí, serveru dojde místo a e-shop přestane odpovídat – robotovi i zákazníkovi, který se chystal zaplatit. Pokud to přijde uprostřed kampaně, zaplatili jste reklamu, která vede na web, který se neotevře.
Jak poznat, jestli jde o váš případ?
Čtyři znamení, a když platí kterákoli dvě zároveň, je to skoro jisté:
- Vysoká zátěž bez prodejů. Obrovská zobrazení, žádné košíky. Návštěvy a objednávky k sobě nesedí, ani zdaleka.
- Hosting vás varuje, že spotřebováváte příliš, nebo vám na chvíli pozastaví účet „kvůli ochraně ostatních zákazníků“.
- Padá v podivných hodinách: v noci, v neděli, v náhodných vlnách bez obchodního vzorce.
- Přístupový log ukazuje tisíce adres s parametry filtrů za sebou, všechny různé, vyžádané během pár sekund.
Pokud je při tom pomalá i administrace, máte potvrzení: nejde o veřejnou část, stroj je zahlcený. Psali jsme o tom v článku kdy je pomalost e-shopem a kdy serverem.
Co vám poradí a proč to nestačí?
Tenhle problém přitahuje spoustu oblíbených řešení, která v praxi nevydrží:
- „Zablokujte je v robots.txt.“ Ten soubor je zdvořilá prosba, ne dveře. Roboti, kteří ho respektují, nejsou váš problém; ti, kdo vás shazují, ho nečtou. A když to přeženete, poslechne Google a vy jste se vymazali z výsledků.
- „Zablokujte Facebook a TikTok podle jména.“ Funguje to týden. Změní identitu, přijdou z tisíců různých adres a každý měsíc se objeví tři noví. Je to seznam, který nikdy nedoudržujete.
- „Stačí je označit jako noindex.“ Stránka se značkou noindex vás pořád stojí: robot si o ni musí říct, aby tu značku vůbec přečetl. Pomáhá to vyhledávači, ne vašemu CPU.
- „Pořiďte si větší server.“ Platit dvakrát tolik za to, abyste robotovi zadarmo servírovali katalog, je špatný obchod: další špička bude větší, protože čím lépe odpovídáte, tím rychleji se ptají.
- „Vypněte fasetové vyhledávání.“ Vyřeší to zátěž a rozbije e-shop: filtry jsou to, čím lidé najdou, co si koupí. Druhý den to uvidíte na konverzích.
- „Dejte před to CDN a máte hotovo.“ CDN zrychluje to, co se opakuje. Tady se nic neopakuje: každá kombinace je jedinečná a do vaší databáze dorazí tak jako tak.
- „Zapněte režim pod útokem.“ Buď to ztížíte svým zákazníkům i Googlu, nebo roboti dál projdou. Přežijete s tím odpoledne, ale žít se tak nedá.
Všechna mají stejnou vadu: léčí příznak, tedy provoz, místo příčiny, totiž že je váš e-shop ochotný vyrobit miliony různých stránek pro každého, kdo si o ně řekne.
Kde je skutečné řešení?
To, co opravdu vydrží, se staví ve třech vrstvách a žádná z nich neznamená vypnout filtry:
- Rozhodnout, které kombinace existují. Ze všech, které by váš e-shop dokázal vytvořit, dává zákazníkovi nebo Googlu smysl jen hrstka. Ostatní nepotřebují vlastní adresu, a když ji ztratí, hřiště se zmenší z milionů na pár tisíc.
- Nepustit drahé věci až dolů. Požadavky, které jsou šum, dostanou odpověď dřív, než se dotknou databáze, a platí limit, kolik hledání za minutu smí jeden zdroj spustit. Zákazník jich udělá tři; kdo jich udělá tři sta, zákazník není, ať si říká jakkoli.
- Oddělit ty, kdo soupeří o zdroje. Procházení roboty by nikdy nemělo bojovat o stejné CPU jako něčí pokladna. Když je to postavené správně, robot počkat může; zákazník ne.
Díky tomu zátěž obvykle hned první den prudce klesne a e-shop přestane padat, aniž by zákazníci přišli o jediný filtr a aniž byste na Googlu ztratili pozice. Spíš naopak: jakmile přestanete plýtvat časem Googlu na čtyři sta tisíc opakovaných stránek, začne se dívat na ty, na kterých vám záleží – přesně o tom jsme psali v článku kde začít, když se nezobrazujete.
Pokud s tím bojujete už měsíce
Je to zákeřný problém, protože nikdy neukáže tvář: není žádná chyba, na kterou se podívat, jen e-shop, který některé dny funguje a jiné ne, a hosting, který vám říká, že je to vaše vina.
To vše – rozhodnout, které kombinace existují, odpovídat před databází a držet roboty dál od pokladny – obsahuje modul Ochrana proti botům pro PrestaShop: nainstalujete ho a chrání od první minuty, aniž by zákazníci přišli o jediný filtr, ověřený Google pustí dovnitř a druhý den vám jeho panel ukáže, kolik požadavků zůstalo za dveřmi a kdo je posílal. Jak se nastavují limity na adresu a na síť, aniž byste zablokovali Google, popisujeme v článku omezení počtu požadavků na IP v PrestaShopu.
A pokud si nejste jistí, že jde o váš případ, pošlete nám přístupový log ze špatného dne přes kontaktní formulář: zdarma vám řekneme, kolik z těch požadavků jsou lidé a kolik šum.