Cachování a WordPress

WordPress je velmi šikovný redakční systém pro blogy a menší až středně velké weby. Pohodlně se v něm píše, pro mnoho běžných věcí není problém sehnat plugin (občas se podaří sehnat i dobrý plugin) a sám se aktualizuje. Má to ale i své stinné stránky. Aby tohle bylo vůbec možné a každou chvíli se to nehroutilo,  musí se při každém načtení stránky spousta věcí kontrolovat, třeba i několikanásobně filtrovat a ve výsledku je i jednoduchý web celkem pomalý. Základní instalace s jednoduchým tématem generuje homepage s jedním příspěvkem zhruba 300 ms (může se lišit v závislosti na prostředí a zátěži – údaj je pouze orientační a má sloužit pro relativní srovnání s údaji uvedenými dále).

Rychlost je jedna z důležitých kvalit webu. Ve světle toho, co jsem psal v prvním odstavci, je jasné, že první, co je potřeba zrychlit, je samotné generování stránky. To se v dané situaci dá zařídit jen vypnutím témat (ušetříme až 50 ms a naděláme si spoustu starostí) nebo cachováním (ušetříme daleko víc a nebude s tím moc potíží). WordPress na to má, celkem nepřekvapivě, celou řadu pluginů. Desítky, možná stovky. Testoval jsem tři nejběžnější a výsledky jsou místy překvapivé, místy dokonce děsivé. Vezmeme to podle abeced.

W3 Total Cache

Oficiální web: https://www.w3-edge.com/products/w3-total-cache

Jedná se o jeden z nejrozšířenějších a nejlépe hodnocených cachovacích pluginů. Upřímně nechápu proč.

W3 Total Cache nabízí snad všechny možnosti, které si okolo zrychlování webu můžete přát a můžete je obsluhovat přes poměrně srozumitelné rozhraní. Cachování stránek i fragmentů na disk i do paměti, různé akcelerátory, minifikace HTML, JavaScriptu a CSS pomocí několika různých metod, cachování dat z databáze, Object cache (cachování podle WordPressu), HTTP hlavičky, napojení na asi 15 různých CDN a reverzní proxy. Navrch tu máme nějaké ty nástroje pro sledování, jak efektivní zrychlení vlastně je.

Při rozumném nastavení je zrychlení opravdu markatní, stránka se generuje do 20 ms. Měření je potřeba provádět v anonymním okně, protože pro přihlášeného uživatele (možná jen admina – nezkoušel jsem) se necachuje. Minifikace funguje jak má, minifikuje se opravdu všechno. Výsledek je dobrý.

Má to ovšem řadu háčků. V první řadě, polovinu z těch věcí není vhodné řešit na úrovni aplikace. CSS a JavaScripty by se neměly minifikovat za běhu, ale předem, HTTP hlavičky a gzip by měl rozumně nastavovat server, to samé reverzní proxy. Pokud to server nedělá nebo z nějakého důvodu nechceme na web dávat jen minifikované skripty a styly, je samozřejmě fajn tyto možnosti mít, ovšem je to pořád z nouze ctnost.

Hned druhým problémem je vysoká zátěž na necachovaných stránkách. Doba generování stránky se prodloužila zhruba polovinu. To i v případě, že už je vše minifikované. Prostě po přihlášení se každá stránka generuje pomalu půl vteřiny a W3 Total Cache je jediný plugin, co máme aktivovatný. Bude to tedy jedině horší.

Plugin sám o sobě je dost velký, má přes 6 MB a 745 souborů. To především znamená, že nemá moc smysl snažit se proniknout do toho, co se děje uvnitř. To nepřímo znamená, že tam bude spousta chyb, málokomu se bude chtít je hledat a opravovat a pro ty, kterým se chtít bude, to bude celkem těžké.

Tím se dostáváme k největšímu problému, kterým je bezpečnost. W3 Total Cache dává potenciálnímu útočníkovi k dispoziti takové množství informací, že nad tím zůstává rozum stát. V kódu každé stránky je na konci komentář obsahující následující informace (nedá se to vypnout):

Performance optimized by W3 Total Cache. Learn more: https://www.w3-edge.com/products/ 

Object Caching 687/753 objects using disk 
Page Caching using disk: enhanced Minified using disk 
Database Caching using disk 

Served from: localhost @ 2016-10-24 10:51:08 by W3 Total Cache

Každý tedy ví, že používáte W3 Total Cache a ví také, jaká uložiště pro cache používáte. Když už útočník ví, že používáme W3 Total Cache tak zadá do prohlížeče adresu www.vášweb.cz/wp-content/w3tc-config/master.json a dostane konfiguraci, kde se může dočíst o nastavení všech služeb, které W3 Total Cache využívá, včetně hesel. Tady je na ukázku: master.json. W3 Total Cache tedy umisťuje soubor s konfigurací, obsahující hesla, do přístupného adresáře a nesnaží se tomu ani nijak bránit, třeba alespoň přes .htaccess.

W3 Total Cache je zjevně děravá jak cedník a v historii to vedlo k nejednomu průseru. Zde jeden z posledních: https://wptavern.com/high-risk-xss-vulnerability-discovered-in-w3-total-cache-plugin

Hodnocení: NEBRAT!

Hodí se:

  • Když fandíte hackingu a chcete dát lidem prostor, kde se mohou vyřádit.
  • Rádi trpíte (nebo způsobujete utrpení ostatním, v případě, že se vám o web stará někdo jiný).
  • Chcete někoho poškodit a vypadat přitom jako dobrák.

Nehodí se:

  • Pokud chcete být užiteční.

WP Fastest Cache

Oficiální web: http://www.wpfastestcache.com/

Velmi rozšířený cachovací systém, který se označuje za nejjednodušší a nejrychlejší cache pro WordPress. Z těch tří, co jsem testoval, je skutečně nejjednodušší. Konfiguraci si můžete naklikat v přehledném rozhraní, nic tam vlastně nechybí. Je možné cachovat nebo necachovat pro přihlášené uživatel, minifikovat HTML a CSS a slučovat JavaScripty. Umí dodat potřebné HTTP hlavičky a umí i gzip kompresi, což je, opět, z nouze ctnost pro případ, že to server nedělá. V placené verzi dokonce umí i minifikovat obrázky (to považuji za největší výhodu), JavaScripty (tj. nejen sloučí, ale i minifikuje) a nabízí i nějakou lepší metodu pro minifikace CSS a HTML, než v základní neplacené verzi. Pokud máte menší web, nebo pro vás není problém místo na disku, můžete využít i možnost předcachování, tedy že se vytvoří nacachované stránky ještě dřív, než na ně někdo přijde a budou se tak zobrazovat rychle i stránky, na které celkem nikdo nechodí. Nabízí i možnost cachování mobilní verze webu, to je ale spíš přežitek.

Pokud bylo tvrzení o jednoduchosti pravdivé, prohlášení o nejrychlejším cachování je jednoznačně mylné, lépe řečeno klamné. WP Fastest Cache totiž cachuje jinak, než zbylé dva systémy. Jestli vrátí stránku z cache se rozhoduje až po načtení pluginů, což je až poté, co WordPress udělal většinu práce, které se cachováním chceme vyhnout. Cachovaná stránka se vrátí za cca 120 ms. To není zlé, dá se s tím existovat, ale 120 je pořád daleko víc, než 20. Jistě, i o dost méně, než 300.

Stejně jako každý plugin, i WP Fastest Cache zpomaluje generování necachované stránky, v tomto případě o zhruba 50 ms. Ze všech tří testovaných systémů je to nejméně, přesto to není úplně málo. Pokud by na webu byl obsah, který třeba nechceme cachovat pro přihlášené uživatele a velká část návštěvníků by web používala přihlášených, pak nám může WP Fastest Cache přinést více škody, než užitku.

Narozdíl od předchozího pluginu jsem tu nenarazil na žádnou bezpečnostní díru, i když jsem ji hledal. To jistě neznamená, že tam není. Minimálně však netluče do očí. Jsou tu ale jiné věci, za které bych trestné body udělil. Není tu možnost cachovat do paměti, což je u něčeho, co se prohlašuje za „nejrychlejší“, jednoznačně špatně. Sjednocování JavaScriptů nezpracovává skripty vložené dalšími pluginy a tématem vzhledu, takže vlastně moc nepomáhá. Nevím, jak to je v placené verzi.

Hodnocení: DOBRÉ

Hodí se:

  • Potřebujete zrychlit web a nechcete se tomu příliš věnovat.
  • Potřebujete kompenzovat nedostatky hostingu.
  • Minifikace obrázků v placené verzi.

Nehodí se:

  • Máte hodně přihlášených návštěvníků a obsah, co se přihlášeným návštěvníkům necachuje.
  • Potřebujete cachovat jen data, nebo část stránky.
  • Máte problém s místem na disku.
  • Potřebujete stránky opravdu hodně zrychlit.

WP Super Cache

Oficiální web: https://wordpress.org/plugins/wp-super-cache/

Nemám moc důvěru k věcem se superlativy v názvu, tady jsou však na místě. Zatímco W3 Total Cache je s bezpečností vysloveně na štíru, WP Super Cache k ní přistupuje vážně. Některé věci, jako třeba práva k zápisu do adresářů, dokonce hlídá a upozorní, když narazí na něco, co vypadá rizikově.

WP Super Cache nabízí cachování stránek, úpravu HTTP hlaviček a gzip kompresi (kterou by měl dělat server), podporu CDN i možnost předcachování stránek. Příjemné jsou i debugovací nástroje, díky kterým je možné nastavení patřičně vyladit. Nastavení nabízí široké možnosti, slušná podpora, možnost cachovat nebo necachovat obsah pro přihlášené uživatele, dokonce i dynamické cachování (tj. dynamické části stránek se budou vždy obnovovoat), ovšem za cenu výrazného snížení rychlosti (záleží, co všechno je dynamické).

Když je řeč o rychlosti, WP Super Cache cachuje podobně jako W3 Total Cache, takže nacachovaná stránka se vrátí za cca 20 ms. Zpomalení necachovaných stránek je zhruba o 60 ms.

Nenajdete zde nástroje pro slučování a minifikaci stylů, skryptů, obrázků ani HTML. Nic z toho není až takový problém, za nejzávažnější bych označil absenci minifikace HTML. Ta by jednak ještě více urychlila odbavení cachované stránky a snížila by i nároky na místo na disku.

Hodnocení: VELMI DOBRÉ

Hodí se:

  • Potřebujete zrychlit web nebo kompenzovat nedostatky hostingu.
  • S cachovatelností webu to máte složitější, než jen zapnout/vypnout.
  • Nechcete platit.

Nehodí se:

  • Nevíte, jak cache nastavit.
  • Máte problém s místem na disku.