Zlepšení výkonu webových stránek zapnutím ukládání do mezipaměti v Apache

Přehled

Většina webových stránek obsahuje velké množství obsahu, který se po zveřejnění nemění nebo se mění jen zřídka. A pokaždé, když je vyžádán z webového serveru, ať už je upraven nebo ne, je znovu zpracován a přenesen ke klientovi, což zbytečně spotřebovává cenné systémové prostředky a šířku pásma sítě. Jak vaše webové stránky nebo aplikace získávají na popularitě, klademe na server větší nároky na zpracování obsahu, který je sice dynamicky generovaný, ale statický.

To není efektivní využití zdrojů a nakonec vás to bude stát spoustu peněz, protože budete instalovat další hardware, abyste zvládli zátěž. Právě zde přichází na řadu ukládání do mezipaměti. Neplýtvejme cykly procesoru nebo pamětí RAM na zpracování dříve zpřístupněného obsahu, který se pravděpodobně v určeném čase nezmění. Místo toho budeme servírovat předem zpracovaný obsah, dočasně uložený na serveru nebo v mezipaměti webových prohlížečů. A teprve po změně obsahu nebo po uplynutí stanovené doby požadovaný obsah znovu zpracujeme.

Konfigurace ukládání do mezipaměti v Apache

Apache obsahuje tři moduly pro ukládání obsahu do mezipaměti, jeden jej povoluje a zbývající dva určují, kde se úložiště mezipaměti nachází – na disku nebo v paměti. Určení, který modul použít pro úložiště mezipaměti, závisí na dostupných hardwarových prostředcích a požadavcích na výkon.

Ukládání z disku je pomalé, ale méně nákladné. Obsluha z paměti je rychlá, ale drahá – jak z hlediska nákladů, tak z hlediska spotřeby prostředků. Výkon diskové mezipaměti však můžete zvýšit jejím umístěním na úložiště SSDFLASH namísto běžného rotujícího disku.

  1. Zajistěte, aby byl modul cache_module načten serverem Apache, a to ověřením existence následujícího řádku v konfiguračním souboru serveru Apache bez komentáře.
    LoadModule cache_module modules/mod_cache.so
  2. Pro diskovou mezipaměť zajistěte, aby byl modul disk_cache_module načten serverem Apache. Vyhledejte následující řádek, nekomentovaný.
    LoadModule disk_cache_module modules/mod_disk_cache.so
  3. Přidejte následující řádky buď do konfiguračního souboru serveru Apache (pro globální), nebo uvnitř směrnice VirtualHost (lokalizované aplikace).
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-admin

    CacheEnable disk /

    Zakázat ukládání do mezipaměti na disk pro relativní adresář „/“.

    Cacheroot

    Nastavení adresáře úložiště mezipaměti, kam se bude ukládat veškerý obsah mezipaměti.

    CacheDefaultExpire

    Nastavení výchozího data vypršení platnosti vzhledem k datu původního požadavku v sekundách.

    CacheDisable

    Zakázání ukládání do mezipaměti pro relativní cesty podle volby. Zde by měly být přidány citlivé oblasti a ty, které by neměly být ukládány do mezipaměti.

Nastavení vypršení platnosti obsahu

Ukládání do mezipaměti vyžaduje datum vypršení platnosti, aby fungovalo. Bez data expirace obsahu nemůže mezipaměť určit, zda je obsah zastaralý nebo ne.

Použijte Mod_Expires od Apache

Tento modul umožňuje definovat data expirace obsahu jako celku nebo jednotlivě na základě typu nebo odpovídajícího řetězce.

  1. Ujistěte se, že je modul načten do Apache. Otevřete konfigurační soubor serveru (httpd.conf v systému CentOS) a vyhledejte tento řádek. Pokud je zakomentován znakem ‚#‘, odkomentujte jej.
    LoadModule expires_module modules/mod_expires.so
  2. Přidejte následující řádky buď do konfigurace serveru Apache, konfigurace virtuálního hostitele, direktivy adresáře nebo .htaccess, podle toho, kde chcete nastavit zásady ukládání do mezipaměti.
    <IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day"</IfModule></pre>

    ExpiresActive On

    Zapne mod expires.

    ExpiresDefault

    Nastaví výchozí datum expirace pro veškerý obsah. Přístup plus 1 den nastaví dobu vypršení platnosti na dobu přístupu k obsahu + 1 den, což znamená, že bude uložen do mezipaměti po dobu 24 hodin.

  3. Pokud chcete určitým typům obsahu přiřadit různé hodnoty vypršení platnosti, můžete kromě možnosti ExpiresDefault nebo bez ní použít možnost ExpiresByType. Zde je několik příkladů:
    <IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day" ExpiresByType image/jpg "access plus 5 days" ExpiresByType image/jpeg "access plus 5 days" ExpiresByType image/gif "access plus 5 days" ExpiresByType image/png "access plus 5 days" ExpiresByType text/css "access plus 1 month" ExpiresByType application/pdf "access plus 1 month" ExpiresByType text/x-javascript "access plus 1 month" ExpiresByType application/x-shockwave-flash "access plus 1 month" ExpiresByType image/x-icon "access plus 1 year"</IfModule>

Použití hlaviček HTTP ve webové aplikaci

Data vypršení platnosti a poslední změny může webová aplikace definovat pomocí parametrů hlaviček HTTP. Vývojáři nebo aplikace tak mají kontrolu nad čerstvostí obsahu. Způsob provedení závisí na vaší aplikaci.

  • HTML
    Použijte značku Meta a definujte stáří obsahu. V níže uvedeném příkladu nastavte mezipaměť na soukromou (pouze žádající klient) a maximální stáří na 1 hodinu (3600 sekund).
    <meta http-equiv="Cache-control" content="private,max-age:3600">
  • PHP
    Pomocí funkce Header() nastavte stáří obsahu v hlavičce dokumentů.
    header("Cache-Control: private, max-age=3600");

Cache Non-Expiring Content

Někdy potřebujete cachovat obsah, který nemá nastavené datum expirace. Jak již bylo zmíněno, datum vypršení platnosti je ve výchozím nastavení podmínkou pro fungování mechanismu ukládání do mezipaměti. Můžeme však aplikaci Apache nařídit, aby k obsahu, který nemá definované datum expirace, připojila výchozí datum expirace a uložila jej do mezipaměti. To nám umožňuje volba CacheIgnoreNoLastMod.

  1. Přidejte volbu CacheIgnoreNoLastMod s hodnotou On do umístění, kde máte povoleno ukládání do mezipaměti – do konfiguračního souboru serveru Apache nebo do konfiguračního souboru Virtual Hosts.
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod On

Zabránit prohlížečům v ukládání obsahu do mezipaměti

Problémem výše uvedených konfigurací ukládání do mezipaměti je, že obsah vaší aplikace je ukládán do mezipaměti na dvou místech: na klientovi a na serveru. Pokud obsah aktualizujete a chcete, aby se uživateli zobrazil okamžitě, nemusí se mu to podařit, pokud jeho lokálně uložená verze v mezipaměti ještě nevypršela. Dobu vypršení platnosti můžete zkrátit, ale pak můžete zcela zmařit účel ukládání do mezipaměti.

Místo toho získejte plnou kontrolu nad ukládáním do mezipaměti tím, že jej povolíte pouze na serveru. Vynuťte webový prohlížeč, aby při každém požadavku získal obsah ze serveru, ale servíroval například předzpracovaný obsah Java nebo PHP, pokud nebyl obsah změněn. Tím zajistíte, že uživatel vždy uvidí nejnovější verzi, a zároveň nebudete zbytečně plýtvat cykly procesoru nebo pamětí RAM při opětovném zpracování.

  1. Přidejte volbu CacheIgnoreCacheControl do umístění, kde je mezipaměť povolena – konfigurační soubor serveru Apache nebo konfigurace virtuálního hostitele – s hodnotou On . To způsobí, že Apache bude ignorovat požadavky na obnovení obsahu prohlížeče. Veškerý obsah bude obsluhován z mezipaměti serveru, pokud je to možné, dokud nevyprší její platnost.
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod OnCacheIgnoreCacheControl On
  2. Uložení změn.
  3. Restartování Apache pro uplatnění změn.

WordPress a další aplikační rámce

Rámce, jako je ten WordPressův a podobné CodeIgniteru, směrují veškerý obsah přes Index.php. V závislosti na tom, jak jste napsali pravidla mod_rewrite, se obsah uložený v mezipaměti bude zobrazovat nesprávně. Může se stát, že se obsah jedné požadované stránky, kategorie atd. zobrazí místo toho, co bylo skutečně požadováno.

Pro boj s tímto problémem musíme zajistit, aby mezipaměť Apache brala v úvahu parametry připojené na konec index.php, když se obsah ukládá do mezipaměti a stahuje. Upravte pravidlo Rewrite pro index.php, jak je vidět na příkladu níže.

# WordPress Permalink rewritesRewriteBase /RewriteRule ^index.php$ – RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ /index.php/ 

.

Napsat komentář