Förbättra webbplatsens prestanda genom att aktivera cachning i Apache

Översikt

De flesta webbplatser har stora mängder innehåll som förblir oförändrat eller sällan ändras efter publicering. Och varje gång det begärs från webbservern, ändrat eller inte, bearbetas det på nytt och överförs till klienten, vilket förbrukar värdefulla systemresurser och nätverksbandbredd i onödan. I takt med att din webbplats eller ditt program ökar i popularitet ställs större krav på din server för att bearbeta innehåll som visserligen genereras dynamiskt, men som ändå är statiskt.

Detta är ingen effektiv användning av resurserna och det kommer så småningom att kosta dig mycket pengar, eftersom du måste installera mer hårdvara för att hålla jämna steg med belastningen. Det är här caching kommer in i bilden. Låt oss inte slösa CPU-cykler eller RAM-minne på att bearbeta tidigare åtkommet innehåll som sannolikt inte kommer att ändras inom en bestämd tidsperiod. I stället serverar vi förbehandlat innehåll som lagras tillfälligt på servern eller i webbläsarens cache. Och först när innehållet har ändrats eller en bestämd tid har gått kommer vi att bearbeta det begärda innehållet på nytt.

Konfigurera caching i Apache

Apache levereras med tre moduler för caching av innehåll, en aktiverar det och de återstående två bestämmer var cache-lagret finns – på disk eller i minnet. Att bestämma vilken modul som ska användas för cache-lagret beror på dina tillgängliga hårdvaruresurser och prestandakrav.

Servering från disk är långsamt men billigare. Servering från minnet är snabb, men dyr – både i fråga om kostnad och resursförbrukning. Du kan dock öka prestandan för diskcache genom att placera den på SSDFLASH-lagring i stället för på konventionell snurrande disk.

  1. Säkerställ att cache_modulen laddas av Apache genom att kontrollera att följande rad finns i Apaches serverkonfigurationsfil, utan att den är kommenterad.
    LoadModule cache_module modules/mod_cache.so
  2. För caching på disk säkerställer du att disk_cache_modulen laddas av Apache. Leta efter följande rad, okommenterad.
    LoadModule disk_cache_module modules/mod_disk_cache.so
  3. Lägg till följande rader i antingen Apaches serverkonfigurationsfil (för globala) eller inuti ett VirtualHost-direktiv (för lokaliserade program).
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-admin

    CacheEnable disk /

    Unable caching to disk for relative directory ”/”.

    Cacheroot

    Inställer cache-lagringskatalogen, där allt cachat innehåll sparas.

    CacheDefaultExpire

    Inställer standardförfallodatumet, i förhållande till det ursprungliga förfrågningsdatumet, i sekunder.

    CacheDisable

    Inaktiverar cachning för relativa sökvägar som följer alternativet. Känsliga områden och sådana som inte ska cachas bör läggas till här.

Setting Content Expiration

Caching kräver ett utgångsdatum för att fungera. Utan ett utgångsdatum för ditt innehåll kan cacheminnet inte avgöra om det är inaktuellt eller inte.

Använd Apaches Mod_Expires

Med denna modul kan du definiera utgångsdatum för ditt innehåll, som helhet eller individuellt baserat på typ eller matchande sträng.

  1. Säkerställ att modulen laddas in i Apache. Öppna serverkonfigurationsfilen (httpd.conf i CentOS) och leta efter den här raden. Om den är kommenterad med ett ”#”, lägg bort kommentaren.
    LoadModule expires_module modules/mod_expires.so
  2. Lägg till följande rader i antingen Apache-serverkonfigurationen, konfigurationen av en virtuell värd, ett katalogdirektiv eller .htaccess, beroende på var du vill att cachingpolicyn ska ställas in.
    <IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day"</IfModule></pre>

    ExpiresActive On

    Sätter på mod expires.

    ExpiresDefault

    Sätt standardutgångsdatumet för allt innehåll. Åtkomst plus 1 dag ställer in utgångstiden till innehållets åtkomsttid + 1 dag, vilket innebär att det kommer att cachelagras i 24 timmar.

  3. Om du vill tilldela specifika innehållstyper olika utgångsvärden kan du använda alternativet ExpiresByType, utöver eller utan ExpiresDefault-alternativet. Här är några exempel:
    <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>

Använd HTTP-huvuden i webbapplikationen

Datum för utgång och senaste ändring kan definieras av webbapplikationen med hjälp av HTTP-huvudparametrar. Detta ger utvecklarna eller applikationen kontroll över innehållets färskhet. Hur du gör detta beror på din applikation.

  • HTML
    Använd metataggen och definiera innehållets ålder. I exemplet nedan ställer du in cacheminnet till privat (endast begärande klient) och den maximala åldern till 1 timme (3600 sekunder).
    <meta http-equiv="Cache-control" content="private,max-age:3600">
  • PHP
    Använd funktionen Header() för att ställa in innehållsåldern i dokumenthuvudet.
    header("Cache-Control: private, max-age=3600");

Cachelagra innehåll som inte har något utgångsdatum

Ibland behöver du cacheminnet för innehåll som inte har ett utgångsdatum. Som tidigare nämnts är utgångsdatum ett krav för att cachemekanismen ska fungera som standard. Vi kan dock instruera Apache att lägga till ett standardutgångsdatum till innehåll som inte har något definierat utgångsdatum och lägga det i cache. Med CacheIgnoreNoLastMod kan vi göra detta.

  1. Lägg till alternativet CacheIgnoreNoLastMod med värdet On på den plats där du har aktiverat caching – Apaches serverkonfigurationsfil eller en konfigurationsfil för Virtual Hosts.
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod On

Förhindra webbläsare från att cacha innehåll

Problemet med ovanstående konfigurationer för cachelagring är att innehållet i ditt program cachas på två platser: på klienten och på servern. Om du uppdaterar ditt innehåll och vill att användaren ska se det omedelbart kanske de inte kan göra det om deras lokalt cachelagda version inte har löpt ut. Du kan förkorta utgångstiden, men då kan du motverka syftet med caching helt och hållet.

Ta full kontroll över caching i stället genom att endast aktivera den på servern. Tvinga webbläsaren att hämta innehållet från servern vid varje begäran, men servera till exempel förbehandlat Java- eller PHP-innehåll om inte innehållet har ändrats. Detta säkerställer att användaren alltid ser den senaste versionen, samtidigt som den inte slösar bort CPU-cykler eller RAM-minne genom att bearbeta om i onödan.

  1. Lägg till alternativet CacheIgnoreCacheControl på den plats där caching är aktiverat – Apaches serverkonfigurationsfil eller en virtuell värds konfiguration – med ett värde på On . Detta får Apache att ignorera förfrågningar om uppdatering av webbläsarens innehåll. Allt innehåll kommer att serveras från serverns cache, om möjligt, tills det har löpt ut.
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod OnCacheIgnoreCacheControl On
  2. Spara ändringarna.
  3. Starta om Apache för att tillämpa ändringarna.

WordPress och andra programramverk

Framverk, som WordPress och sådana som liknar CodeIgniter, dirigerar allt innehåll via Index.php. Beroende på hur du har skrivit dina mod_rewrite-regler kommer ditt cachade innehåll att visas felaktigt. Det kan hända att innehållet för en begärd sida, kategori etc. visas i stället för det som faktiskt begärdes.

För att motverka detta måste vi se till att Apaches cache tar hänsyn till de parametrar som läggs till i slutet av index.php när innehållet cachas och hämtas. Ändra Rewrite-regeln för index.php enligt exemplet nedan.

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

Lämna en kommentar