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:
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:
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.
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 eenvoudigedbm
-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 ommod_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:
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:
<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:
. . .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:
<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.
Als u ervoor kiest om deCacheRoot
waarde aan te passen, moet u het/etc/default/apache2
bestand openen en de waarde van deHTCACHECLEAN_PATH
aanpassen 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.
<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.
<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:
<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:
<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