Jak nakonfigurovat hlavičky Cache-Control v Apache

  • Anthony Heddings
  • 29. července 2020, 11:00 EDT

apache

Každý prohlížeč uživatele využívá k ukládání stažených objektů vestavěnou mezipaměť, která může výrazně urychlit opakované návštěvy vašeho webu tím, že se načítá z disku, nikoli ze sítě. Zde se dozvíte, jak ji v Apache nakonfigurovat.

Jak funguje ukládání do mezipaměti?

Při prvním připojení k vašemu webu si uživatel stáhne všechny statické zdroje potřebné k vykreslení stránky, včetně věcí, jako je vaše logo. Když přejde na novou stránku, načte se vaše logo z paměti, místo aby o něj znovu žádal, čímž se výrazně zrychlí výkon a sníží zatížení webového serveru.

Jedná se o mezipaměť na straně klienta, ale mnoho webů také využívá síť pro doručování obsahu neboli CDN. Síť CDN je síť serverů, které se nacházejí před vaším hlavním webovým serverem neboli serverem „origin“. Tato síť ukládá vaše stránky do mezipaměti, čímž zvyšuje maximální šířku pásma, snižuje latenci přístupu a výrazně snižuje zátěž vašeho původního serveru. Pokud se chcete o sítích CDN dozvědět více, můžete si o nich přečíst našeho průvodce zde.

Cache-Control je hlavička, kterou můžete nakonfigurovat tak, aby váš webový server přidával do všech odchozích požadavků, a která prohlížeči a sítím CDN sdělí, jak mají váš obsah ukládat do mezipaměti.

Reklama

Některé stránky by nikdy neměly být ukládány do mezipaměti prostřednictvím sdílených mezipamětí, jako jsou sítě CDN. Pokud tak učiníte, hrozí, že se osobní údaje jednoho uživatele zobrazí ostatním. Obecně platí, že pokud bude stránka pro všechny uživatele naprosto stejná, například domovská stránka, můžete ji do mezipaměti uložit. Pokud zobrazuje důvěrné informace o uživateli, budete ji chtít zařadit na černou listinu mezipaměti. Statické zdroje, jako jsou CSS a obrázky, lze obvykle uložit do mezipaměti pro všechny, často na mnohem delší dobu.

Důležitá je také doba, kterou objekt stráví v mezipaměti. Maximální stáří vašich zdrojů v mezipaměti, označované jako TTL (Time-To-Live), určuje, jak dlouho zůstane objekt v mezipaměti, než bude zneplatněn a vyzván k vyžádání nového objektu. U statických zdrojů, které se příliš nemění, můžete nastavit velmi vysoké hodnoty TTL, obvykle kolem dvou let. U věcí, které můžete chtít aktualizovat, budete chtít nastavit nižší hodnoty TTL, abyste zabránili tomu, že zastaralé prostředky budou v mezipaměti příliš dlouho.

K vyvolání opětovného načtení mezipaměti můžete vždy použít názvy souborů s verzí. Pokud vydáte novou verzi listu stylu CSS, můžete jej pojmenovat styles-1.0.1.css a prohlížeč uživatele (a všechny sítě CDN před ním) jej uvidí jako nový soubor, který je třeba znovu stáhnout. U některých sítí CDN můžete navíc vydat ruční zneplatnění, abyste propláchli stávající mezipaměť, aniž byste měnili názvy souborů.

Jak používat Cache-Control v Apache

Cache-Control má několik možností:

  • public – Může být uložen do mezipaměti kýmkoli, včetně prohlížečů a sítí CDN. Použijte ji pro většinu statických objektů.
  • private – Obsahuje citlivá data, která nemohou být cachována sítěmi CDN nebo reverzními proxy servery. Prohlížeč uživatele je může ukládat do lokální mezipaměti. Použijte ji pro většinu ověřených stránek.
  • no-cache – Navzdory názvu nezakáže ukládání do mezipaměti. Prohlížeč může stále ukládat odpověď do mezipaměti kvůli výkonu, ale před použitím musí zkontrolovat aktualizace u serveru původu. Použijte ji, pokud chcete, aby uživatel pokaždé znovu ověřoval.
  • no-store – Zcela zakáže ukládání do mezipaměti. Použijte ji pouze pro velmi citlivá data, která by neměla být odesílána dvakrát.

Dodatečně můžete přidat direktivu no-transform, která zakáže veškeré konverze, které mohou být se zdrojem provedeny. Některé sítě CDN například komprimují obrázky, aby snížily šířku pásma. Tato direktiva toto chování zakáže.

V Apache budete muset tuto hlavičku nastavit ručně pomocí direktivy Header set, například takto:

Header set Cache-Control "max-age=84600, public"

Hodnota max-age se nastavuje v sekundách, například max-age=300 pro pětiminutové TTL a max-age=63072000 pro dva roky.

Reklama

Tuto směrnici můžete umístit do kořene konfigurace, aby platila pro celý web, ale lepší metodou je použít nastavení v závislosti na typu souboru. Chcete-li například nastavit vysoký TTL pro většinu statických médií, můžete použít blok FilesMatch:

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$"> Header set Cache-Control "max-age=63072000, public" </FilesMatch>

Pokud chcete určitou cestu zařadit na černou listinu pro ukládání do mezipaměti sítěmi CDN, můžete použít blok Directory:

<Directory "/private"> Header set Cache-Control "max-age=300, private" </Directory> 

Nebo jednoduše porovnejte jeden soubor:

<File "protected.html"> Header set Cache-Control "max-age=300, private" </File>

Bloky s konkrétnějšími shodami budou mít přednost před obecnými regexovými shodami, ale budete chtít ověřit, zda je na přijímací straně vše nastaveno správně. To můžete zkontrolovat v nástroji Chrome DevTools v části Síťové hlavičky >.

záložka Chrome devtools network

Pokud máte přístup pouze ke konfiguraci .htaccess, můžete stále používat porovnávání adresářů vytvořením nového souboru .htaccess v každém podadresáři.

Použití náhradní kontroly k přímé úpravě chování sítě CDN

Záhlaví Surrogate-Control funguje přesně jako Cache-Control, ale podrobně popisuje konkrétní pokyny pro sítě CDN a reverzní proxy servery, nikoli pro koncové uživatele. Tímto způsobem můžete síti CDN říci, aby dělala jednu věc, ale prohlížeči posílala jiné pokyny.

Reklama

Tuto hlavičku budete muset nastavit ručně, stejně jako jste nastavili Cache-Control:

Header set Surrogate-Control "max-age=300, public"

Pro ověření, zda to funguje, budete určitě chtít otestovat s vaší sítí CDN – hlavička Surrogate-Control je poměrně nová a není univerzální.

Anthony Heddings
Anthony Heddings je rezidentní cloudový inženýr společnosti LifeSavvy Media, technický spisovatel, programátor a odborník na platformu AWS společnosti Amazon. Pro časopisy How-To Geek a CloudSavvy IT napsal stovky článků, které byly přečteny milionkrát.Přečtěte si celý životopis “

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.