De prestaties van websites verbeteren door caching in Apache in te schakelen

Overzicht

De meeste websites bevatten grote hoeveelheden inhoud die ongewijzigd blijft of zelden wordt gewijzigd na publicatie. Telkens wanneer de inhoud van de webserver wordt opgevraagd, al dan niet gewijzigd, wordt deze opnieuw verwerkt en naar de client verzonden, waardoor onnodig waardevolle systeembronnen en netwerkbandbreedte worden verbruikt. Naarmate uw website of applicatie aan populariteit wint, wordt er meer van uw server gevraagd om inhoud te verwerken die, hoewel dynamisch gegenereerd, statisch is.

Dit is geen efficiënt gebruik van bronnen en het zal u uiteindelijk veel geld kosten, omdat u meer hardware installeert om de belasting bij te houden. Dit is waar caching om de hoek komt kijken. Laten we geen CPU cycles of RAM verspillen aan het verwerken van eerder opgevraagde inhoud die waarschijnlijk niet binnen een bepaalde tijd zal veranderen. In plaats daarvan serveren we voorbewerkte inhoud, tijdelijk opgeslagen op de server of in de cache van de webbrowser. En pas nadat de inhoud is gewijzigd of een bepaalde tijd is verstreken, zullen we de opgevraagde inhoud opnieuw verwerken.

Caching configureren in Apache

Apache heeft drie modules voor het cachen van inhoud, een maakt het mogelijk en de andere twee bepalen waar de cache zich bevindt – op schijf of in het geheugen. Welke module voor de cache opslag gebruikt moet worden hangt af van de beschikbare hardware bronnen en prestatie eisen.

Voorzien vanaf schijf is langzaam maar minder duur. Serveren vanuit het geheugen is snel, maar duur – zowel in kosten als in het verbruik van hulpbronnen. U kunt de prestaties van disk cache echter opvoeren door deze op SSDFLASH opslag te plaatsen in plaats van op een conventionele draaiende schijf.

  1. Zorg ervoor dat de cache_module wordt geladen door Apache, door te controleren of de volgende regel bestaat in Apache’s server configuratiebestand, ongecommentarieerd.
    LoadModule cache_module modules/mod_cache.so
  2. Voor disk caching, zorg ervoor dat de disk_cache_module wordt geladen door Apache. Zoek naar de volgende regel, ongecommentarieerd.
    LoadModule disk_cache_module modules/mod_disk_cache.so
  3. Voeg de volgende regels toe aan het Apache-serverconfiguratiebestand (voor globale) of binnen een VirtualHost-richtlijn (gelokaliseerde toepassing).
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-admin

    CacheEnable disk /

    Maak caching op schijf onmogelijk voor relatieve directory “/”.

    Cacheroot

    Stel de cacheopslagdirectory in, waar alle cache-inhoud wordt opgeslagen.

    CacheDefaultExpire

    Stel de standaard verlooptijd in, relatief aan de oorspronkelijke aanvraagdatum, in seconden.

    CacheDisable

    Schakelt caching uit voor relatieve paden die de optie volgen. Gevoelige gebieden en gebieden die niet in de cache mogen worden opgenomen, moeten hier worden toegevoegd.

Instellen van de vervaldatum van de inhoud

Caching vereist een vervaldatum om te kunnen werken. Zonder een vervaldatum kan de cache niet bepalen of de inhoud oud is of niet.

Gebruik Apache’s Mod_Expires

Met deze module kunt u vervaldata voor uw inhoud instellen, als geheel of individueel op basis van type of overeenkomende string.

  1. Zorg ervoor dat de module in Apache wordt geladen. Open het configuratiebestand van de server (httpd.conf in CentOS) en zoek naar deze regel. Haal het commentaar eruit, als het is uitgecommentarieerd met een ‘#’.
    LoadModule expires_module modules/mod_expires.so
  2. Voeg de volgende regels toe aan ofwel de Apache server configuratie, een virtuele host configuratie, een directory directief, of .htaccess, afhankelijk van waar u uw cachingbeleid wilt instellen.
    <IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day"</IfModule></pre>

    ExpiresActive On

    Het inschakelen van mod expires.

    ExpiresDefault

    Stel de standaard vervaldatum in voor alle inhoud. Toegang plus 1 dag stelt de vervaldatum in op de toegangstijd van de inhoud + 1 dag, wat betekent dat de inhoud 24 uur in de cache blijft.

  3. Als u verschillende vervalwaarden wilt toekennen aan specifieke inhoudstypen, kunt u de optie ExpiresByType gebruiken, naast of zonder de optie ExpiresDefault. Hier volgen een paar voorbeelden:
    <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>

Gebruik HTTP Headers in de Web Applicatie

Verval- en laatste modificatie data kunnen worden gedefinieerd door de web applicatie met behulp van HTTP Header parameters. Dit geeft de ontwikkelaars of de applicatie controle over de versheid van de inhoud. Hoe u dit doet, hangt af van uw toepassing.

  • HTML
    Gebruik de Meta-tag en definieer de leeftijd van de inhoud. In het onderstaande voorbeeld stelt u de cache in op private (alleen aanvragende client) en de maximale leeftijd op 1 uur (3600 seconden).
    <meta http-equiv="Cache-control" content="private,max-age:3600">
  • PHP
    Gebruik de functie Header() om de leeftijd van de inhoud in de documents header in te stellen.
    header("Cache-Control: private, max-age=3600");

Cache Non-Expiring Content

Soms moet u inhoud cachen waarvoor geen vervaldatum is ingesteld. Zoals eerder gezegd, is een vervaldatum standaard een vereiste om het caching mechanisme te laten werken. We kunnen Apache echter opdracht geven om een standaard vervaldatum toe te voegen aan inhoud waarvoor geen vervaldatum is gedefinieerd, en deze te cachen. Met CacheIgnoreNoLastMod kunnen we dit doen.

  1. Voeg de optie CacheIgnoreNoLastMod met de waarde Aan toe aan de locatie waar u caching hebt ingeschakeld – het serverconfiguratiebestand van Apache of een configuratiebestand van Virtual Hosts.
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod On

Voorkom dat browsers inhoud cachen

Het probleem met de bovenstaande caching-configuraties is dat de inhoud van uw toepassing op twee locaties in de cache wordt opgeslagen: op de client en op de server. Als je de inhoud bijwerkt en je wilt dat de gebruiker het meteen ziet, kan het zijn dat hij dat niet kan als de lokaal opgeslagen versie nog niet verlopen is. Je kunt de vervaltijd verkorten, maar dan verspeel je het doel van caching volledig.

Haal de volledige controle over caching, door het alleen op de server in te schakelen. Dwing de webbrowser om de inhoud van de server te halen voor elk verzoek, maar serveer voorbewerkte Java of PHP inhoud, bijvoorbeeld, tenzij de inhoud is gewijzigd. Dit zorgt ervoor dat de gebruiker altijd de meest recente versie te zien krijgt, terwijl er niet onnodig CPU-cycli of RAM-geheugen worden verspild aan het opnieuw verwerken.

  1. Voeg de optie CacheIgnoreCacheControl toe aan de locatie waar caching is ingeschakeld – het serverconfiguratiebestand van Apache of de configuratie van een virtuele host – met een waarde van Aan . Dit zorgt ervoor dat Apache browser content refresh verzoeken negeert. Alle inhoud zal worden geserveerd vanuit de cache van de server, waar mogelijk, totdat deze is verlopen.
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod OnCacheIgnoreCacheControl On
  2. Bewaar uw wijzigingen.
  3. Restart Apache om uw wijzigingen toe te passen.

WordPress en andere applicatie frameworks

Frameworks, zoals die van WordPress en die vergelijkbaar zijn met CodeIgniter, routeren alle inhoud via Index.php. Afhankelijk van hoe u uw mod_rewrite regels hebt geschreven, zal uw cache-inhoud verkeerd worden weergegeven. Het kan zijn dat de inhoud van een opgevraagde pagina, categorie, etc, verschijnt in plaats van wat er werkelijk is opgevraagd.

Om dit te bestrijden, moeten we ervoor zorgen dat Apache’s cache rekening houdt met de parameters die zijn toegevoegd aan het einde van de index.php wanneer de inhoud wordt gecached en opgehaald. Wijzig de Rewrite regel voor index.php, zoals te zien is in het voorbeeld hieronder.

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

Plaats een reactie