Hoe configureer je Apache Content Caching op Ubuntu 14.04

Wat is caching?

Caching is een methode om de serverprestaties te verbeteren door vaak opgevraagde inhoud tijdelijk op te slaan op een manier die snellere toegang mogelijk maakt. Dit versnelt de verwerking en levering door het schrappen van een aantal resource-intensieve operaties.

Door het creëren van effectieve caching regels, inhoud die geschikt is voor caching zal worden opgeslagen om de responstijden te verbeteren, middelen te besparen, en de belasting te minimaliseren. Apache biedt een verscheidenheid aan caches die geschikt zijn voor het versnellen van verschillende soorten bewerkingen. In deze gids bespreken we hoe u Apache 2.4 op Ubuntu 14.04 kunt configureren met de verschillende caching-modules.

Om meer te leren over het ontwikkelen van algemene caching-strategieën, bekijk dit artikel.

Een inleiding tot caching in Apache

Apache kan inhoud cachen met verschillende niveaus van verfijning en schaalbaarheid. Het project verdeelt deze in drie groepen, afhankelijk van de methode waarop de inhoud wordt gecachet. De algemene indeling is:

  • File Caching: De meest eenvoudige caching strategie, deze opent simpelweg bestanden of file descriptors wanneer de server start en houdt ze beschikbaar om toegang te versnellen.
  • Key-Value Caching: Voornamelijk gebruikt voor SSL en authenticatie caching, key-value caching maakt gebruik van een gedeeld object model dat items kan opslaan die kostbaar zijn om herhaaldelijk te berekenen.
  • Standaard HTTP caching: De meest flexibele en algemeen bruikbare caching mechanisme, deze drie-state systeem kan antwoorden op te slaan en te valideren wanneer ze verlopen. Dit kan worden geconfigureerd voor prestaties of flexibiliteit, afhankelijk van uw specifieke behoeften.

Een snelle blik op de bovenstaande beschrijvingen kan onthullen dat de bovenstaande methoden enige overlap hebben, maar ook dat het nuttig kan zijn om meer dan één strategie tegelijk te gebruiken. Door bijvoorbeeld een key-value store voor uw SSL sessies te gebruiken en een standaard HTTP cache voor antwoorden in te schakelen, kunt u uw gegevensbronnen aanzienlijk ontlasten en veel content delivery operaties voor uw clients versnellen.

Nu u een breed begrip hebt van elk van Apache’s caching mechanismen, laten we deze systemen in meer detail bekijken.

File Caching

Algemeen overzicht

  • Belangrijkste betrokken modules: mod_file_cache
  • Belangrijkste use cases: het opslaan van ofwel bestandsinhoud ofwel bestandsdescriptors wanneer de server start. Dit zijn statische representaties die niet betrouwbaar kunnen worden gewijzigd totdat de server opnieuw wordt opgestart.
  • Eigenschappen: eenvoudig, verbetert de prestaties van langzame bestandssystemen
  • Nadelen: experimentele functie, reageert niet op updates op het bestandssysteem, moet spaarzaam worden gebruikt om binnen de beperkingen van het besturingssysteem te passen, kan alleen worden gebruikt op statische bestanden

De details

De mod_file_cache module wordt voornamelijk gebruikt om de bestandstoegang te versnellen op servers met langzame bestandssystemen. U kunt kiezen uit twee configuratie-richtlijnen, die beide tot doel hebben het proces van het serveren van statische bestanden te versnellen door een deel van het werk uit te voeren wanneer de server wordt gestart in plaats van wanneer de bestanden worden opgevraagd.

De CacheFile-richtlijn wordt gebruikt om het pad op te geven naar bestanden op schijf waartoe u de toegang wilt versnellen. Wanneer Apache wordt gestart, zal Apache de gespecificeerde statische bestanden openen en het handvat van het bestand in de cache opslaan, zodat het niet nodig is het bestand te openen wanneer het wordt opgevraagd. Het aantal bestanden dat op deze manier kan worden geopend is afhankelijk van de beperkingen die uw besturingssysteem stelt.

De MMapFile directive opent ook bestanden wanneer Apache voor het eerst wordt gestart. Echter, MMapFile cached de inhoud van het bestand in het geheugen in plaats van alleen de file handler. Dit zorgt voor snellere prestaties voor die pagina’s, maar het heeft enkele serieuze beperkingen. Het houdt niet bij hoeveel geheugen het heeft gebruikt, dus het is mogelijk om zonder geheugen te komen zitten. Merk ook op dat kindprocessen elk van het toegewezen geheugen zullen kopiëren, wat kan resulteren in snellere uitputting van bronnen dan je in eerste instantie zou verwachten. Gebruik deze richtlijn dus spaarzaam.

Deze richtlijnen worden alleen geëvalueerd als Apache start. Dit betekent dat u er niet op kunt vertrouwen dat Apache wijzigingen oppikt die na het starten zijn aangebracht. Gebruik deze alleen voor statische bestanden die tijdens de Apache sessie niet veranderen. Afhankelijk van hoe de bestanden worden gewijzigd, kan de server op de hoogte worden gebracht van wijzigingen, maar dit is niet het verwachte gedrag en zal niet altijd goed werken. Als er wijzigingen moeten worden aangebracht in bestanden die aan deze directives zijn doorgegeven, start Apache dan opnieuw nadat de wijzigingen zijn aangebracht.

Hoe Bestands Caching Inschakelen

Bestands caching wordt geleverd door de mod_file_cache module. Om deze functionaliteit te gebruiken, moet u de module inschakelen.

Wanneer u Ubuntu 14.04 draait, zal de module geïnstalleerd zijn, maar uitgeschakeld wanneer u Apache installeert. U kunt de module inschakelen door te typen:

  • sudo a2enmod file_cache

Daarna moet u het hoofdconfiguratiebestand bewerken om uw bestands caching directieven in te stellen. Open het bestand door te typen:

  • sudo nano /etc/apache2/apache2.conf

Om het cachen van bestandsafhandelingen in te stellen, gebruikt u de CacheFile directief. Deze directief neemt een lijst van bestandspaden, gescheiden door spaties, als volgt:

/etc/apache2/apache2.conf
CacheFile /var/www/html/index.html /var/www/html/somefile.index

Wanneer de server opnieuw wordt gestart, zal Apache de genoemde bestanden openen en hun bestandshandvatten in de cache opslaan voor snellere toegang.

Als u in plaats daarvan een paar bestanden direct in het geheugen wilt opslaan, kunt u de MMapFile directief gebruiken. De syntax is in principe hetzelfde als de laatste directive, in die zin dat het simpelweg een lijst met bestandspaden neemt:

/etc/apache2/apache2.conf
MMapFile /var/www/html/index.html /var/www/html/somefile.index

In de praktijk zou er geen reden zijn om zowel CacheFile als MMapFile te configureren voor dezelfde set bestanden, maar u zou beide kunnen gebruiken voor verschillende sets bestanden.

Wanneer u klaar bent, kunt u de bestanden opslaan en sluiten. Controleer de syntax van het configuratiebestand door te typen:

  • sudo apachectl configtest

Als op de laatste regel Syntax OK staat, kunt u veilig uw Apache instantie herstarten:

  • sudo service apache2 restart

Apache zal herstarten, en de inhoud van het bestand of de handlers cachen, afhankelijk van de directives die u hebt gebruikt.

Key-Value Caching

Algemeen overzicht

  • Belangrijkste betrokken modules: mod_socache_dbm, mod_socache_dc, mod_socache_memcache, mod_socache_shmcb
  • Betrokken ondersteunende modules: mod_authn_socache, mod_ssl
  • Belangrijkste use cases: opslaan van SSL sessies of authenticatie details, SSL stapling
  • Features: shared object cache om complexe bronnen op te slaan, kan helpen bij SSL sessie caching en stapling, flexibele backends
  • Nadelen: heeft geen validatiemechanismen, moet aparte software configureren voor performantere/flexibelere backends, enkele bugs in code

The Details

Key-value caching is complexer dan file caching en heeft meer gerichte voordelen. De Apache key-value cache, ook wel bekend als shared object cache, wordt voornamelijk gebruikt om het herhalen van dure operaties te voorkomen die te maken hebben met het opzetten van de toegang van een client tot inhoud, in tegenstelling tot de inhoud zelf. Specifiek kan het worden gebruikt om authenticatie details, SSL sessies en SSL stapling te cachen.

Note

Momenteel zijn er enkele problemen met elke gedeelde object cache provider. Verwijzingen naar de problemen worden hieronder geschetst. Houd hiermee rekening bij het beoordelen of u deze functie wilt inschakelen.

De eigenlijke caching wordt uitgevoerd door een van de caching-provider-modules voor gedeelde objecten te gebruiken. Deze modules zijn:

  • mod_socache_dbm: Deze backend maakt gebruik van de eenvoudige dbm-database-engine, een op bestanden gebaseerde opslag van sleutelwaarden die gebruikmaakt van hashing en emmers met een vaste grootte. Deze provider heeft last van geheugenlekken, dus in de meeste gevallen wordt aangeraden om mod_socache_shmcb te gebruiken.
  • mod_socache_dc: Deze provider gebruikt de distcache session caching software. Dit project is sinds 2004 niet meer bijgewerkt en is zelfs voor sommige distributies niet meer beschikbaar, dus gebruik het met een gezonde dosis voorzichtigheid.
  • mod_socache_memcache: Deze gebruikt de memcache gedistribueerde geheugen object cache voor het opslaan van items. Dit is de beste optie voor een gedistribueerde cache onder meerdere servers. Momenteel verlopen de items niet goed, maar er is een patch naar de basislijn van Apache’s versiebeheer gecommiteerd die dit probleem verhelpt.
  • mod_socache_shmcb: Momenteel is dit de beste optie voor key-value caching. Deze cacht naar een cyclische buffer in gedeeld geheugen, die entries verwijdert als hij vol raakt. Het verslikt zich op dit moment bij entries van meer dan 11k.

Naast de bovenstaande provider modules, zullen aanvullende modules nodig zijn, afhankelijk van de objecten die gecached worden. Om bijvoorbeeld SSL sessies te cachen of om SSL stapling in te stellen, moet mod_ssl worden ingeschakeld, die respectievelijk de SSLSessionCache en SSLStaplingCache directieven zal verschaffen. Op dezelfde manier, om authenticatie caching in te stellen, moet de mod_authn_socache module worden ingeschakeld, zodat de AuthnCacheSOCache directive kan worden ingesteld.

Hoe Key-Value Caching Inschakelen

Met de bovenstaande bugs en waarschuwingen in gedachten, als u nog steeds dit type caching in Apache wilt configureren, volg dan hieronder.

De methode die wordt gebruikt om de key-value cache in te stellen zal afhangen van waar het voor zal worden gebruikt en welke provider u gebruikt. We zullen de basis van zowel authenticatie caching als SSL sessie caching hieronder bespreken.

Er is momenteel een bug met authenticatie caching die het onmogelijk maakt om argumenten door te geven aan de cache provider. Dus alle providers die geen standaardinstellingen bieden om op terug te vallen, zullen problemen ondervinden.

Authenticatie caching

Authenticatie caching is nuttig als u een dure authenticatiemethode gebruikt, zoals LDAP of database authenticatie. Dit soort operaties kan een aanzienlijke impact hebben op de prestaties als de backend iedere keer moet worden aangesproken als er een authenticatieverzoek wordt gedaan.

Het instellen van caching houdt in dat uw bestaande authenticatieconfiguratie moet worden aangepast (we zullen in deze gids niet behandelen hoe u authenticatie moet instellen). De wijzigingen zelf zullen vrijwel hetzelfde zijn, ongeacht de backend authenticatie methode. We zullen mod_socache_shmcb gebruiken voor onze demonstratie.

Zet eerst de authn_socache module en de mod_socache_shmcb provider module aan door te typen:

  • sudo a2enmod authn_socache
  • sudo a2enmod socache_shmcb

Open uw hoofd Apache configuratie bestand zodat u deze gedeelde cache backend kunt specificeren voor gebruik met authenticatie:

  • sudo nano /etc/apache2/apache2.conf

Binnenin, bovenaan het bestand, voegt u de AuthnCacheSOCache directief toe. Specificeer dat shmcb moet worden gebruikt als de provider. Als de eerder besproken bug die het passeren van opties verhindert, is opgelost tegen de tijd dat u dit leest, kunt u een locatie en grootte voor de cache opgeven. Het getal is in bytes, dus het voorbeeld in het commentaar resulteert in een cache van 512 kilobyte:

/etc/apache2/apache2.conf
AuthnCacheSOCache shmcb# If the bug preventing passed arguments to the provider gets fixed,# you can customize the location and size like this#AuthnCacheSOCache shmcb:${APACHE_RUN_DIR}/auth_cache(512000)

Bewaar en sluit het bestand als u klaar bent.

Naar aanleiding hiervan opent u uw virtuele host configuratiepagina waarop authenticatie is geconfigureerd. We nemen aan dat u de configuratie 000-default.conf virtual host gebruikt, maar u moet deze aanpassen aan uw omgeving:

  • sudo nano /etc/apache2/sites-enabled/000-default.conf

Op de plaats waar u de authenticatie hebt geconfigureerd, wijzigt u het blok om caching toe te voegen. In het bijzonder moet u de AuthnCacheProvideFor toevoegen om te vertellen welke authenticatie bronnen gecached moeten worden, een cache timeout toevoegen met AuthnCacheTimeout, en socache toevoegen aan de AuthBasicProvider lijst voor uw conventionele authenticatie methode. Het resultaat zal er ongeveer zo uitzien:

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> . . . <Directory /var/www/html/private> AuthType Basic AuthName "Restricted Files" AuthBasicProvider socache file AuthUserFile /etc/apache2/.htpasswd AuthnCacheProvideFor file AuthnCacheTimeout 300 Require valid-user </Directory></VirtualHost>

Het bovenstaande voorbeeld is voor bestandsauthenticatie, die waarschijnlijk niet veel voordeel zal hebben van caching. De implentatie zou echter zeer gelijkaardig moeten zijn wanneer andere authenticatiemethodes gebruikt worden. Het enige wezenlijke verschil zou zijn waar de “file” specificatie staat in het bovenstaande voorbeeld, de andere authenticatie methode zou in plaats daarvan worden gebruikt.

Bewaar en sluit het bestand. Herstart Apache om uw caching veranderingen door te voeren:

  • sudo service apache2 restart

SSL Session Caching

De handshake die moet worden uitgevoerd om een SSL verbinding tot stand te brengen, brengt een aanzienlijke overhead met zich mee. Als zodanig kan het cachen van de sessie gegevens om deze initialisatie stap te vermijden voor verdere verzoeken deze straf mogelijk omzeilen. De gedeelde object cache is een perfecte plaats hiervoor.

Als u SSL al heeft geconfigureerd voor uw Apache server, mod_ssl zal worden ingeschakeld. Op Ubuntu betekent dit dat een ssl.conf bestand is verplaatst naar de /etc/apache2/mods-enabled directory. Dit stelt eigenlijk al caching in. Binnenin ziet u enkele regels zoals deze:

/etc/apache2/mods-enabled/ssl.conf
. . .SSLSessionCache shmcb:${APACHE_RUN_DIR}/ssl_scache(512000)SSLSessionCacheTimeout 300. . .

Dit is eigenlijk genoeg om sessie caching in te stellen. Om dit te testen, kunt u OpenSSL’s verbindingsclient gebruiken. Type:

  • openssl s_client -connect 127.0.0.1:443 -reconnect -no_ticket | grep Session-ID

Als de sessie-ID in alle resultaten hetzelfde is, werkt uw sessie-cache correct. Druk op CTRL-C om terug te gaan naar de terminal.

Standaard HTTP Caching

Algemeen overzicht

  • Belangrijkste betrokken modules: mod_cache
  • Betrokken ondersteunende modules: mod_cache_disk, mod_cache_socache
  • Belangrijkste use-cases: Caching algemene inhoud
  • Eigenschappen: Kan HTTP caching headers correct interpreteren, kan stale entries opnieuw valideren, kan worden ingezet voor maximale snelheid of flexibiliteit, afhankelijk van uw behoeften
  • Nadelen: Kan gevoelige gegevens lekken indien onjuist geconfigureerd, moet extra modules gebruiken om het cachingbeleid correct in te stellen

De details

Het HTTP-protocol moedigt aan en biedt de mechanismen voor het cachen van reacties langs het hele pad van de inhoudslevering. Elke computer die de inhoud aanraakt, kan elk item mogelijk gedurende een bepaalde tijd cachen, afhankelijk van het cachingbeleid dat is ingesteld bij de oorsprong van de inhoud en de eigen cachingregels van de computer.

Het Apache HTTP-cachingmechanisme cached reacties volgens het HTTP-cachingbeleid dat het ziet. Dit is een cachingsysteem voor algemene doeleinden dat zich houdt aan dezelfde regels die elke tussenliggende server zou volgen die een hand heeft in de aflevering. Dit maakt dit systeem zeer flexibel en krachtig en stelt je in staat om gebruik te maken van de headers die je al zou moeten instellen op je inhoud (we zullen hieronder behandelen hoe je dit moet doen).

Apache’s HTTP-cache staat ook bekend als een “three state” cache. Dit komt omdat de inhoud die het heeft opgeslagen in een van de drie staten kan zijn. Het kan vers zijn, wat betekent dat het zonder verdere controle aan klanten mag worden geserveerd, het kan muf zijn, wat betekent dat de TTL op de inhoud is verlopen, of het kan niet-bestaand zijn als de inhoud niet in de cache wordt gevonden.

Als de inhoud muf wordt, kan de cache bij het volgende verzoek deze opnieuw valideren door de inhoud bij de bron te controleren. Als die niet is veranderd, kan hij de versheidsdatum opnieuw instellen en de huidige inhoud serveren. Zo niet, dan wordt de gewijzigde inhoud opgehaald en opgeslagen voor de tijd die is toegestaan door het caching beleid.

Module Overzicht

De HTTP caching logica is beschikbaar via de mod_cache module. Het eigenlijke cachen wordt gedaan met een van de caching providers. Meestal wordt de cache op schijf opgeslagen met behulp van de mod_cache_disk module, maar gedeelde object caching is ook beschikbaar via de mod_cache_socache module.

De mod_cache_disk module cached op schijf, dus het kan handig zijn als je inhoud proxyed vanaf een afgelegen locatie, het genereert vanuit een dynamisch proces, of gewoon probeert dingen te versnellen door te cachen op een snellere schijf dan waar je inhoud normaal gesproken op staat. Dit is de meest geteste provider en zou waarschijnlijk in de meeste gevallen uw eerste keuze moeten zijn. De cache wordt niet automatisch opgeschoond, dus een tool genaamd htcacheclean moet af en toe worden uitgevoerd om de cache te verkleinen. Dit kan handmatig worden uitgevoerd, als een reguliere cron opdracht, of als een daemon worden uitgevoerd.

De mod_cache_socache module cached naar een van de gedeelde object providers (dezelfde die in de laatste sectie zijn besproken). Dit kan mogelijk betere prestaties leveren dan mod_cache_disk (afhankelijk van welke gedeelde cache provider is gekozen). Het is echter veel nieuwer en vertrouwt op de gedeelde object providers, die de eerder besproken bugs hebben. Uitvoerig testen wordt aanbevolen voordat de mod_cache_socache optie wordt geïmplementeerd.

HTTP Cache Plaatsing

Apache’s HTTP cache kan worden ingezet in twee verschillende configuraties, afhankelijk van uw behoeften.

Als de CacheQuickHandler is ingesteld op “on”, zal de cache zeer vroeg in het request afhandelingsproces worden gecontroleerd. Als er inhoud wordt gevonden, wordt deze direct geserveerd zonder verdere afhandeling. Dit betekent dat het ongelofelijk snel is, maar het betekent ook dat het geen ruimte laat voor processen zoals authenticatie voor inhoud. Als er inhoud in je cache zit die normaal authenticatie of toegangscontrole vereist, zal het voor iedereen toegankelijk zijn zonder authenticatie als de CacheQuickHandler op “on” staat.

Basically, dit emuleert een aparte cache in de voorkant van uw webserver. Als uw webserver enige vorm van voorwaardelijke controle, authenticatie of autorisatie moet doen, zal dit niet gebeuren. Apache zal zelfs geen directives evalueren binnen <Location> of <Directory> blokken. Merk op dat CacheQuickHandler standaard op “on” staat!

Als CacheQuickHandler op “off” staat, zal de cache aanzienlijk later in de request verwerkingsvolgorde worden gecontroleerd. Zie deze configuratie als het plaatsen van de cache tussen de Apache verwerkingslogica en de daadwerkelijke inhoud. Hierdoor kunnen de conventionele verwerkingsrichtlijnen worden uitgevoerd voordat de inhoud uit de cache wordt opgehaald. Door dit op “off” te zetten, wordt een beetje snelheid ingeruild voor de mogelijkheid om verzoeken dieper te verwerken.

Hoe Standaard HTTP Caching Te Configureren

Om caching in te schakelen, moet u de mod_cache module inschakelen, evenals een van zijn caching providers. Zoals we hierboven al zeiden, mod_cache_disk is goed getest, dus daar zullen we op vertrouwen.

De modules inschakelen

Op een Ubuntu systeem, kunt u deze modules inschakelen door te typen:

  • sudo a2enmod cache
  • sudo a2enmod cache_disk

Dit zal de caching functionaliteit inschakelen de volgende keer dat de server opnieuw wordt opgestart.

U moet ook het apache2-utils pakket installeren, dat het htcacheclean hulpprogramma bevat dat wordt gebruikt om de cache te verkleinen wanneer dat nodig is. U kunt dit installeren door te typen:

  • sudo apt-get update
  • sudo apt-get install apache2-utils

Wijziging van de Globale Configuratie

Het grootste deel van de configuratie voor caching zal plaatsvinden binnen individuele virtuele host definities of locatie blokken. Het inschakelen van mod_cache_disk maakt echter ook een globale configuratie mogelijk die kan worden gebruikt om enkele algemene attributen op te geven. Open dat bestand nu om er eens naar te kijken:

  • sudo nano /etc/apache2/mods-enabled/cache_disk.conf

Met het commentaar verwijderd, zou het bestand er zo uit moeten zien:

/etc/apache2/mods-enabled/cache_disk.conf
<IfModule mod_cache_disk.c> CacheRoot /var/cache/apache2/mod_cache_disk CacheDirLevels 2 CacheDirLength 1</IfModule>

De IfModule wrapper vertelt Apache om zich alleen zorgen te maken over deze directieven als de mod_cache_disk module is ingeschakeld. De CacheRoot richtlijn specificeert de plaats op schijf waar de cache zal worden onderhouden. De CacheDirLevels en CacheDirLength bepalen beide hoe de cache directory structuur zal worden opgebouwd.

Een md5 hash van de URL die wordt geserveerd zal worden aangemaakt als de sleutel die wordt gebruikt om de gegevens op te slaan. De gegevens zullen worden georganiseerd in mappen die zijn afgeleid van de beginletters van elke hash. CacheDirLevels specificeert het aantal subdirectories dat moet worden aangemaakt en CacheDirLength specificeert hoeveel karakters moeten worden gebruikt als de naam van elke directory. Dus een hash van b1946ac92492d2347c6235b4d2611184 met de standaard waarden zoals hierboven getoond zou worden gearchiveerd in een directory structuur van b/1/946ac92492d2347c6235b4d2611184. Meestal hoeft u deze waarden niet aan te passen, maar het is goed om te weten waar ze voor worden gebruikt.

Note

Als u ervoor kiest om deCacheRootwaarde aan te passen, moet u het/etc/default/apache2bestand openen en de waarde van deHTCACHECLEAN_PATHaanpassen aan uw keuze. Dit wordt gebruikt om de cache met regelmatige tussenpozen op te schonen, dus het moet de juiste locatie van de cache hebben.

Enkele andere waarden die u in dit bestand kunt instellen zijn CacheMaxFileSize en CacheMinFileSize die de bereiken van bestandsgroottes in bytes instellen die Apache zal vastleggen in de cache, evenals CacheReadSize en CacheReadTime, waarmee u kunt wachten en inhoud kunt bufferen voordat deze naar de client wordt verzonden. Dit kan handig zijn als de inhoud ergens anders staat dan op deze server.

De virtuele server aanpassen

De meeste configuratie voor caching zal op een meer granulair niveau gebeuren, ofwel in de virtuele host definitie of in een specifiek locatieblok.

Open een van uw virtuele host bestanden om mee te volgen. We nemen aan dat u het standaard bestand gebruikt in deze handleiding:

  • sudo nano /etc/apache2/sites-enabled

In het virtuele host blok, buiten een locatie blok, kunnen we beginnen met het configureren van enkele van de caching eigenschappen. In deze handleiding zullen we aannemen dat we de CacheQuickHandler uit willen zetten, zodat er meer verwerking plaatsvindt. Dit stelt ons in staat om meer volledige caching regels op te stellen.

We zullen ook van deze gelegenheid gebruik maken om cache vergrendeling te configureren. Dit is een systeem van bestandssloten die Apache gebruikt om te controleren of de inhoud nog geldig is. Gedurende de tijd dat aan deze vraag wordt voldaan, zouden extra verzoeken voor dezelfde inhoud resulteren in extra verzoeken aan de backend bron, wat belastingspieken zou kunnen veroorzaken.

Het instellen van een cache-lock voor een bron tijdens validatie vertelt Apache dat de bron op dit moment wordt ververst. Gedurende deze tijd kan de oudbakken bron geserveerd worden met een waarschuwingsheader die de status aangeeft. We zetten dit op met een cache lock directory in de /tmp map. We staan een maximum van 5 seconden toe voor een “lock” om als geldig beschouwd te worden. Deze voorbeelden komen rechtstreeks uit Apache’s documentatie, dus ze zouden goed moeten werken voor onze doeleinden.

We zullen Apache ook vertellen om de Set-Cookie headers te negeren en ze niet in de cache op te slaan. Dit voorkomt dat Apache per ongeluk gebruikers-specifieke cookies lekt naar andere partijen. De Set-Cookie header zal worden gestript voordat de headers in de cache worden opgeslagen.

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined CacheQuickHandler off CacheLock on CacheLockPath /tmp/mod_cache-lock CacheLockMaxAge 5 CacheIgnoreHeaders Set-Cookie</VirtualHost>

We moeten caching nog steeds inschakelen voor deze virtuele host. We kunnen dit doen met de CacheEnable directive. Als deze is ingesteld in een virtueel host blok, moeten we de caching methode (disk of socache) opgeven, evenals de aangevraagde URI’s die in de cache moeten worden geplaatst. Bijvoorbeeld, om alle antwoorden te cachen, zou dit kunnen worden ingesteld op CacheEnable disk /, maar als u alleen antwoorden onder de /public URI wilt cachen, zou u dit kunnen instellen op CacheEnable disk /public.

We zullen een andere route nemen door onze cache in te schakelen binnen een specifiek locatieblok. Dit betekent dat we geen URI pad hoeven op te geven aan het CacheEnable commando. Elke URI die zou worden geserveerd vanaf die locatie zal worden gecached. We zullen ook de CacheHeader directive aanzetten, zodat onze response headers zullen aangeven of de cache is gebruikt om het verzoek te serveren of niet.

Een andere directive die we zullen instellen is CacheDefaultExpire, zodat we een vervaldatum kunnen instellen (in seconden) als noch de Expires noch de Last-Modified headers zijn ingesteld op de inhoud. Op dezelfde manier stellen we CacheMaxExpire in om de tijd te beperken dat items worden bewaard. We stellen de CacheLastModifiedFactor in zodat Apache een vervaldatum kan aanmaken als er wel een Last-Modified datum is, maar geen vervaldatum. De factor wordt vermenigvuldigd met de tijd sinds wijziging om een redelijke vervaldatum in te stellen.

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined CacheQuickHandler off CacheLock on CacheLockPath /tmp/mod_cache-lock CacheLockMaxAge 5 CacheIgnoreHeaders Set-Cookie <Location /> CacheEnable disk CacheHeader on CacheDefaultExpire 600 CacheMaxExpire 86400 CacheLastModifiedFactor 0.5 </Location></VirtualHost>

Save and close your file when you’ve configured everything that you need.

Controleer de gehele configuratie op syntaxfouten door te typen:

  • sudo apachectl configtest

Als er geen fouten worden gerapporteerd, herstart dan de service door te typen:

  • sudo service apache2 restart

Setting Expires and Caching Headers on Content

In de bovenstaande configuratie hebben we HTTP caching geconfigureerd, wat afhankelijk is van HTTP headers. Echter, geen van de inhoud die we serveren heeft daadwerkelijk de Expires of Cache-Control headers die nodig zijn om intelligente caching beslissingen te nemen. Om deze headers in te stellen, moeten we gebruik maken van nog een paar modules.

De mod_expires module kan zowel de Expires header als de max-age optie in de Cache-Control header instellen. De mod_headers module kan worden gebruikt om meer specifieke Cache-Control opties toe te voegen om de caching policy verder af te stellen.

We kunnen deze beide modules inschakelen door te typen:

  • sudo a2enmod expires
  • sudo a2enmod headers

Na het inschakelen van deze modules, kunnen we direct weer verder gaan met het aanpassen van onze virtual host file:

  • sudo nano /etc/apache2/sites-enabled/000-default.conf

De mod_expires module biedt slechts drie directives. De ExpiresActive zet expiration processing aan in een bepaalde context door deze op “on” te zetten. De andere twee directives lijken erg op elkaar. De ExpiresDefault directief stelt de standaard verlooptijd in, en de ExpiresByType stelt de verlooptijd in volgens het MIME type van de inhoud. Beide zullen de Expires en de Cache-Control “max-age” op de juiste waarden zetten.

Deze twee instellingen kunnen twee verschillende syntaxen aannemen. De eerste is eenvoudigweg “A” of “M” gevolgd door een aantal seconden. Dit stelt de vervaldatum in ten opzichte van de laatste keer dat de inhoud respectievelijk “geopend” of “gewijzigd” werd. Bijvoorbeeld, beide zouden de inhoud laten verlopen 30 seconden nadat deze is benaderd.

ExpiresDefault A30ExpireByType text/html A30

De andere syntaxis staat een meer uitgebreide configuratie toe. Het staat u toe om andere eenheden dan seconden te gebruiken die voor mensen gemakkelijker te berekenen zijn. Het gebruikt ook het volledige woord “toegang” of “wijziging”. De hele configuratie van de expiratie moet tussen aanhalingstekens staan, zoals dit:

ExpiresDefault "modification plus 2 weeks 3 days 1 hour"ExpiresByType text/html "modification plus 2 weeks 3 days 1 hour"

Voor ons doel stellen we alleen een standaard expiratie in. We zullen beginnen met deze in te stellen op 5 minuten, zodat als we een fout maken tijdens het vertrouwd raken, deze niet extreem lang bewaard zal blijven op de computers van onze cliënten. Wanneer we meer vertrouwen hebben in ons vermogen om policies te selecteren die geschikt zijn voor onze inhoud, kunnen we dit aanpassen naar iets agressievers:

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined CacheQuickHandler off CacheLock on CacheLockPath /tmp/mod_cache-lock CacheLockMaxAge 5 CacheIgnoreHeaders Set-Cookie <Location /> CacheEnable disk CacheHeader on CacheDefaultExpire 600 CacheMaxExpire 86400 CacheLastModifiedFactor 0.5 ExpiresActive on ExpiresDefault "access plus 5 minutes" </Location></VirtualHost>

Dit zal onze Expires header op vijf minuten in de toekomst zetten en Cache-Control max-age=300 instellen. Om ons caching beleid verder te verfijnen, kunnen we de Header directive gebruiken. We kunnen de merge optie gebruiken om extra Cache-Control opties toe te voegen. Je kunt dit meerdere keren aanroepen en de extra policies toevoegen die je wilt. Bekijk deze handleiding om een idee te krijgen van de caching policies die je zou willen instellen voor je inhoud. Voor ons voorbeeld stellen we alleen “public” in, zodat andere caches er zeker van kunnen zijn dat ze kopieën mogen opslaan.

Om ETags in te stellen voor statische inhoud op onze site (om te gebruiken voor validatie), kunnen we de FileETag directief gebruiken. Dit zal werken voor statische inhoud. Voor dynamisch gegenereerde inhoud, zal uw applicatie verantwoordelijk zijn voor het correct genereren van ETags.

We gebruiken de directive om de attributen in te stellen die Apache zal gebruiken om de Etag te berekenen. Dit kan INode, MTime, Size, of All zijn, afhankelijk van of we de ETag willen aanpassen wanneer de inode van het bestand verandert, de wijzigingstijd verandert, de grootte verandert, of al het bovenstaande. U kunt meer dan één waarde opgeven, en u kunt de geërfde instelling in kind-contexten wijzigen door de nieuwe instellingen vooraf te laten gaan door een + of -. Voor onze doeleinden zullen we gewoon “all” gebruiken, zodat alle wijzigingen worden geregistreerd:

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined CacheQuickHandler off CacheLock on CacheLockPath /tmp/mod_cache-lock CacheLockMaxAge 5 CacheIgnoreHeaders Set-Cookie <Location /> CacheEnable disk CacheHeader on CacheDefaultExpire 600 CacheMaxExpire 86400 CacheLastModifiedFactor 0.5 ExpiresActive on ExpiresDefault "access plus 5 minutes" Header merge Cache-Control public FileETag All </Location></VirtualHost>

Dit zal “public” (gescheiden door een komma) toevoegen aan de waarde die Cache-Control al heeft en zal een ETag voor onze statische inhoud bevatten.

Wanneer u klaar bent, slaat u het bestand op en sluit u het. Controleer de syntax van uw wijzigingen door te typen:

  • sudo apachectl configtest

Als er geen fouten zijn gevonden, start u de service opnieuw om uw caching beleid te implementeren:

  • sudo service apache2 restart

Conclusie

Het configureren van caching met Apache kan een ontmoedigende klus lijken vanwege de vele opties die er zijn. Gelukkig is het eenvoudig om eenvoudig te beginnen en dan te groeien naarmate je meer complexiteit nodig hebt. De meeste beheerders zullen niet alle caching types nodig hebben.

Wanneer u caching configureert, houd dan de specifieke problemen in gedachten die u probeert op te lossen om te voorkomen dat u verdwaalt in de verschillende implementatiekeuzes. De meeste gebruikers zullen er baat bij hebben om in ieder geval headers in te stellen. Als je inhoud proxy’t of genereert, kan het instellen van een HTTP cache nuttig zijn. Gedeelde object caching is nuttig voor specifieke taken zoals het opslaan van SSL sessies of authenticatie details als je een backend provider gebruikt. Cachen van bestanden kan waarschijnlijk beperkt worden tot mensen met langzame systemen.

Leave a Reply