Come configurare il Content Caching di Apache su Ubuntu 14.04

Che cos’è il Caching?

Il Caching è un metodo per migliorare le prestazioni del server consentendo al contenuto comunemente richiesto di essere temporaneamente memorizzato in modo da consentire un accesso più veloce. Questo accelera l’elaborazione e la consegna tagliando alcune operazioni che richiedono molte risorse.

Con la creazione di regole di caching efficaci, il contenuto che è adatto al caching sarà memorizzato per migliorare i tempi di risposta, conservare le risorse e minimizzare il carico. Apache fornisce una varietà di cache adatte a velocizzare diversi tipi di operazioni. In questa guida, parleremo di come configurare Apache 2.4 su Ubuntu 14.04 utilizzando i suoi vari moduli di caching.

Per saperne di più sullo sviluppo di strategie generali di caching, date un’occhiata a questo articolo.

Un’introduzione al caching in Apache

Apache può memorizzare contenuti nella cache con vari livelli di sofisticazione e scalabilità. Il progetto li divide in tre gruppi in base al metodo con cui il contenuto viene memorizzato nella cache. La suddivisione generale è:

  • File Caching: La strategia di caching più basilare, questa apre semplicemente i file o i descrittori di file all’avvio del server e li mantiene disponibili per velocizzare l’accesso.
  • Key-Value Caching: Principalmente usato per SSL e per il caching dell’autenticazione, il key-value caching usa un modello di oggetto condiviso che può memorizzare elementi che sono costosi da calcolare ripetutamente.
  • Standard HTTP caching: Il meccanismo di caching più flessibile e generalmente utile, questo sistema a tre stati può memorizzare risposte e validarle quando scadono. Questo può essere configurato per le prestazioni o la flessibilità a seconda delle esigenze specifiche.

Un rapido sguardo alle descrizioni di cui sopra può rivelare che i metodi di cui sopra hanno qualche sovrapposizione, ma anche che può essere utile utilizzare più di una strategia allo stesso tempo. Per esempio, usare un negozio di valori chiave per le tue sessioni SSL e abilitare una cache HTTP standard per le risposte potrebbe permetterti di togliere un carico significativo dalle tue fonti di dati e accelerare molte operazioni di consegna dei contenuti per i tuoi clienti.

Ora che hai un’ampia comprensione di ciascuno dei meccanismi di caching di Apache, esaminiamo questi sistemi più in dettaglio.

File Caching

General Overview

  • Moduli principali coinvolti: mod_file_cache
  • Principali casi d’uso: memorizzazione dei contenuti dei file o dei descrittori dei file all’avvio del server. Queste sono rappresentazioni statiche che non possono essere cambiate in modo affidabile fino al riavvio del server.
  • Caratteristiche: semplice, migliora le prestazioni dei filesystem lenti
  • Svantaggi: caratteristica sperimentale, non risponde agli aggiornamenti del filesystem, deve essere usato con parsimonia per rientrare nei limiti del sistema operativo, può essere usato solo su file statici

I dettagli

Il modulo mod_file_cache è usato principalmente per accelerare l’accesso ai file sui server con filesystem lenti. Fornisce una scelta di due direttive di configurazione, entrambe mirate ad accelerare il processo di servire i file statici eseguendo parte del lavoro quando il server viene avviato piuttosto che quando i file vengono richiesti.

La direttiva CacheFile viene usata per specificare il percorso dei file sul disco a cui si vorrebbe accelerare l’accesso. Quando Apache viene avviato, Apache aprirà i file statici che sono stati specificati e metterà in cache l’handle del file, evitando la necessità di aprire il file quando viene richiesto. Il numero di file che possono essere aperti in questo modo è soggetto alle limitazioni stabilite dal vostro sistema operativo.

Anche la direttiva MMapFile apre i file al primo avvio di Apache. Tuttavia, MMapFile mette in cache il contenuto del file in memoria piuttosto che il solo gestore del file. Questo permette prestazioni più veloci per quelle pagine, ma ha alcune serie limitazioni. Non mantiene alcuna registrazione della quantità di memoria che ha usato, quindi è possibile esaurire la memoria. Notate anche che i processi figli copieranno tutta la memoria allocata, il che può risultare in un esaurimento delle risorse più veloce di quanto si possa prevedere inizialmente. Usate questa direttiva solo con parsimonia.

Queste direttive sono valutate solo quando Apache si avvia. Questo significa che non puoi contare sul fatto che Apache raccolga i cambiamenti fatti dopo il suo avvio. Usale solo su file statici che non cambieranno per tutta la durata della sessione di Apache. A seconda di come i file vengono modificati, il server potrebbe essere avvisato dei cambiamenti, ma questo non è il comportamento previsto e non sempre funziona correttamente. Se è necessario apportare modifiche ai file passati a queste direttive, riavviare Apache dopo che le modifiche sono state fatte.

Come abilitare il file caching

Il file caching è fornito dal modulo mod_file_cache. Per utilizzare questa funzionalità, è necessario abilitare il modulo.

Quando si utilizza Ubuntu 14.04, il modulo sarà installato ma disabilitato quando si installa Apache. Puoi abilitare il modulo digitando:

  • sudo a2enmod file_cache

In seguito, dovresti modificare il file di configurazione principale per impostare le tue direttive di caching dei file. Aprite il file digitando:

  • sudo nano /etc/apache2/apache2.conf

Per impostare la cache dei file handle, usate la direttiva CacheFile. Questa direttiva prende una lista di percorsi di file, separati da spazi, come questa:

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

Quando il server viene riavviato, Apache aprirà i file elencati e memorizzerà i loro handle nella cache per un accesso più veloce.

Se, invece, si desidera mappare alcuni file direttamente in memoria, è possibile utilizzare la direttiva MMapFile. La sua sintassi è fondamentalmente la stessa dell’ultima direttiva, in quanto prende semplicemente una lista di percorsi di file:

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

In pratica, non ci sarebbe motivo di configurare sia CacheFile che MMapFile per lo stesso insieme di file, ma si potrebbero usare entrambi su insiemi diversi di file.

Quando si è finito, si possono salvare e chiudere i file. Controlla la sintassi del file di configurazione digitando:

  • sudo apachectl configtest

Se l’ultima riga recita Syntax OK, puoi tranquillamente riavviare la tua istanza di Apache:

  • sudo service apache2 restart

Apache si riavvierà, mettendo in cache il contenuto dei file o i gestori a seconda delle direttive che hai usato.

Key-Value Caching

General Overview

  • I moduli principali coinvolti: mod_socache_dbm, mod_socache_dc, mod_socache_memcache, mod_socache_shmcb
  • Moduli di supporto coinvolti: mod_authn_socache, mod_ssl
  • Principali casi d’uso: memorizzazione di sessioni SSL o dettagli di autenticazione, spillatura SSL
  • Caratteristiche: cache di oggetti condivisi per memorizzare risorse complesse, può assistere nella cache e spillatura di sessioni SSL, backend flessibile
  • Svantaggi: non ha meccanismi di validazione, necessità di configurare software separato per backend più performanti/flessibili, alcuni bug nel codice

I dettagli

La cache a valori chiave è più complessa della cache a file e ha benefici più mirati. Conosciuta anche come cache di oggetti condivisi, la cache chiave-valore di Apache è usata principalmente per evitare di ripetere le costose operazioni coinvolte nella configurazione dell’accesso di un client al contenuto, al contrario del contenuto stesso. In particolare, può essere usata per mettere in cache i dettagli dell’autenticazione, le sessioni SSL e per fornire la spillatura SSL.

Nota

Attualmente, ci sono alcuni problemi con ogni fornitore di cache ad oggetti condivisi. I riferimenti ai problemi saranno delineati di seguito. Prendeteli in considerazione quando valutate se abilitare questa caratteristica.

La cache effettiva è realizzata attraverso l’uso di uno dei moduli di provider di cache ad oggetti condivisi. Questi sono:

  • mod_socache_dbm: Questo backend usa il semplice motore di database dbm, che è un negozio di valori-chiave basato su file che fa uso di hashing e bucket a dimensione fissa. Questo provider soffre di alcune perdite di memoria, quindi nella maggior parte dei casi si raccomanda di usare invece mod_socache_shmcb.
  • mod_socache_dc: Questo provider usa il software di caching di sessione distcache. Questo progetto non è stato aggiornato dal 2004 e non è nemmeno pacchettizzato per alcune distribuzioni, quindi usalo con una sana dose di cautela.
  • mod_socache_memcache: Questo usa la cache di oggetti a memoria distribuita memcache per memorizzare gli oggetti. Questa è l’opzione migliore per una cache distribuita tra più server. Attualmente, non fa scadere correttamente le voci, ma una patch è stata inserita nel trunk del controllo di versione di Apache che risolve il problema.
  • mod_socache_shmcb: Attualmente, questa è l’opzione migliore per la cache dei valori chiave. Questo fa la cache su un buffer ciclico nella memoria condivisa, che rimuoverà le voci quando sarà pieno. Attualmente si blocca su voci di dimensioni superiori a 11k.

Oltre ai moduli provider di cui sopra, saranno necessari moduli aggiuntivi a seconda degli oggetti in cache. Per esempio, per mettere in cache le sessioni SSL o per configurare lo stapling SSL, deve essere abilitato mod_ssl, che fornirà rispettivamente le direttive SSLSessionCache e SSLStaplingCache. Allo stesso modo, per impostare il caching dell’autenticazione, il modulo mod_authn_socache deve essere abilitato in modo che la direttiva AuthnCacheSOCache possa essere impostata.

Come abilitare il Key-Value Caching

Con i bug e i caveat di cui sopra in mente, se vuoi ancora configurare questo tipo di caching in Apache, segui qui sotto.

Il metodo usato per impostare la cache chiave-valore dipenderà da ciò che verrà usato e dal provider che stai usando. Andremo oltre le basi della cache di autenticazione e della cache di sessione SSL qui sotto.

Al momento, c’è un bug con la cache di autenticazione che impedisce di passare argomenti al provider della cache. Quindi qualsiasi provider che non fornisce impostazioni predefinite su cui ripiegare avrà dei problemi.

Caching dell’autenticazione

Il caching dell’autenticazione è utile se si sta usando un metodo di autenticazione costoso, come l’autenticazione LDAP o del database. Questi tipi di operazioni possono avere un impatto significativo sulle prestazioni se il backend deve essere colpito ogni volta che viene fatta una richiesta di autenticazione.

Impostare la cache comporta la modifica della configurazione di autenticazione esistente (non tratteremo come impostare l’autenticazione in questa guida). Le modifiche stesse saranno più o meno le stesse indipendentemente dal metodo di autenticazione del backend. Useremo mod_socache_shmcb per la nostra dimostrazione.

Primo, abilita il modulo authn_socache e il modulo provider mod_socache_shmcb digitando:

  • sudo a2enmod authn_socache
  • sudo a2enmod socache_shmcb

Apri il tuo file di configurazione principale di Apache in modo da poter specificare questo backend di cache condiviso per l’uso con l’autenticazione:

  • sudo nano /etc/apache2/apache2.conf

All’interno, verso la cima del file, aggiungi la direttiva AuthnCacheSOCache. Specifica che shmcb deve essere usato come provider. Se il bug discusso in precedenza che impedisce il passaggio delle opzioni è risolto prima che tu legga questo, puoi specificare una posizione e una dimensione per la cache. Il numero è in byte, quindi l’esempio commentato risulterà in una cache di 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)

Salva e chiudi il file quando hai finito.

Poi, apri la pagina di configurazione del tuo host virtuale che ha configurato l’autenticazione. Assumiamo che tu stia usando la configurazione dell’host virtuale 000-default.conf, ma dovresti modificarla per riflettere il tuo ambiente:

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

Nella posizione in cui hai configurato l’autenticazione, modifica il blocco per aggiungere il caching. In particolare, devi aggiungere AuthnCacheProvideFor per dirgli quali fonti di autenticazione mettere in cache, aggiungere un timeout di cache con AuthnCacheTimeout e aggiungere socache alla lista AuthBasicProvider prima del tuo metodo di autenticazione convenzionale. Il risultato sarà qualcosa di simile a questo:

/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>

L’esempio precedente è per l’autenticazione dei file, che probabilmente non beneficerà molto della cache. Tuttavia, l’implementazione dovrebbe essere molto simile quando si usano altri metodi di autenticazione. L’unica differenza sostanziale sarebbe dove la specifica “file” è nell’esempio precedente, l’altro metodo di autenticazione verrebbe usato al suo posto.

Salva e chiudi il file. Riavvia Apache per implementare le tue modifiche alla cache:

  • sudo service apache2 restart

SSL Session Caching

La stretta di mano che deve essere eseguita per stabilire una connessione SSL comporta un overhead significativo. Come tale, la cache dei dati di sessione per evitare questo passo di inizializzazione per ulteriori richieste può potenzialmente evitare questa penalità. La cache degli oggetti condivisi è un posto perfetto per questo.

Se hai già configurato SSL per il tuo server Apache, mod_ssl sarà abilitato. Su Ubuntu, questo significa che un file ssl.conf è stato spostato nella directory /etc/apache2/mods-enabled. Questo in realtà imposta già il caching. All’interno, vedrete alcune linee come questa:

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

Questo è effettivamente sufficiente per impostare il caching di sessione. Per testarlo, puoi usare il client di connessione di OpenSSL. Digita:

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

Se l’ID di sessione è lo stesso in tutti i risultati, la tua cache di sessione funziona correttamente. Premi CTRL-C per tornare al terminale.

Standard HTTP Caching

Panoramica generale

  • Moduli principali coinvolti: mod_cache
  • Moduli di supporto coinvolti: mod_cache_disk, mod_cache_socache
  • Principali casi d’uso: Caching del contenuto generale
  • Caratteristiche: Può interpretare correttamente le intestazioni del caching HTTP, può riconvalidare le voci stantie, può essere distribuito per la massima velocità o flessibilità a seconda delle esigenze
  • Svantaggi: Può perdere dati sensibili se configurato in modo errato, deve usare moduli aggiuntivi per impostare correttamente la politica di caching

I dettagli

Il protocollo HTTP incoraggia e fornisce i meccanismi per il caching delle risposte lungo il percorso di consegna del contenuto. Ogni computer che tocca il contenuto può potenzialmente mettere in cache ogni elemento per una certa quantità di tempo a seconda delle politiche di caching stabilite all’origine del contenuto e delle regole di caching del computer stesso.

Il meccanismo di caching Apache HTTP mette in cache le risposte secondo le politiche di caching HTTP che vede. Si tratta di un sistema di caching per scopi generali che aderisce alle stesse regole che seguirebbe qualsiasi server intermediario che ha una mano nella consegna. Ciò rende questo sistema molto flessibile e potente e ti permette di sfruttare le intestazioni che dovresti già impostare sul tuo contenuto (vedremo come farlo di seguito).

La cache HTTP di Apache è anche conosciuta come una cache a “tre stati”. Questo perché il contenuto che ha memorizzato può essere in uno dei tre stati. Può essere fresco, il che significa che può essere servito ai client senza ulteriori controlli, può essere stantio, il che significa che il TTL sul contenuto è scaduto, o può essere inesistente se il contenuto non si trova nella cache.

Se il contenuto diventa stantio, alla richiesta successiva, la cache può riconvalidarlo controllando il contenuto all’origine. Se non è cambiato, può reimpostare la data di freschezza e servire il contenuto attuale. Altrimenti, recupera il contenuto modificato e lo memorizza per il tempo consentito dalla sua politica di caching.

Panoramica del modulo

La logica di caching HTTP è disponibile attraverso il modulo mod_cache. La cache effettiva è fatta con uno dei fornitori di cache. Tipicamente, la cache è memorizzata su disco usando il modulo mod_cache_disk, ma la cache di oggetti condivisi è disponibile anche attraverso il modulo mod_cache_socache.

Il modulo mod_cache_disk memorizza la cache su disco, quindi può essere utile se stai facendo il proxy del contenuto da una posizione remota, generandolo da un processo dinamico, o semplicemente cercando di accelerare le cose facendo la cache su un disco più veloce di quello su cui risiedono i tuoi contenuti. Questo è il provider più collaudato e dovrebbe probabilmente essere la vostra prima scelta nella maggior parte dei casi. La cache non viene pulita automaticamente, quindi uno strumento chiamato htcacheclean deve essere eseguito occasionalmente per ridurre la cache. Questo può essere eseguito manualmente, impostato come un normale lavoro cron o eseguito come demone.

Il modulo mod_cache_socache fa la cache su uno dei provider di oggetti condivisi (gli stessi discussi nell’ultima sezione). Questo può potenzialmente avere prestazioni migliori di mod_cache_disk (a seconda di quale provider di cache condivisa viene selezionato). Tuttavia, è molto più nuovo e si basa sui provider di oggetti condivisi, che hanno i bug discussi in precedenza. Si raccomanda un test completo prima di implementare l’opzione mod_cache_socache.

Posizionamento della cache HTTP

La cache HTTP di Apache può essere distribuita in due diverse configurazioni a seconda delle tue esigenze.

Se l’opzione CacheQuickHandler è impostata su “on”, la cache sarà controllata molto presto nel processo di gestione della richiesta. Se il contenuto viene trovato, verrà servito direttamente senza ulteriori manipolazioni. Questo significa che è incredibilmente veloce, ma significa anche che non permette processi come l’autenticazione del contenuto. Se c’è del contenuto nella tua cache che normalmente richiede autenticazione o controllo di accesso, sarà accessibile a chiunque senza autenticazione se il CacheQuickHandler è impostato su “on”.

Fondamentalmente, questo emula una cache separata davanti al tuo server web. Se il vostro server web ha bisogno di fare qualsiasi tipo di controllo condizionale, autenticazione o autorizzazione, questo non accadrà. Apache non valuterà nemmeno le direttive all’interno dei blocchi <Location> o <Directory>. Si noti che CacheQuickHandler è impostato su “on” per impostazione predefinita!

Se il CacheQuickHandler è impostato su “off”, la cache sarà controllata significativamente più tardi nella sequenza di elaborazione della richiesta. Pensa a questa configurazione come se mettessi la cache tra la logica di elaborazione di Apache e il tuo contenuto effettivo. Questo permetterà alle direttive di elaborazione convenzionali di essere eseguite prima di recuperare il contenuto dalla cache. Impostando questo parametro su “off” si baratta un po’ di velocità con la capacità di elaborare le richieste in modo più profondo.

Come configurare la cache HTTP standard

Per abilitare la cache, è necessario abilitare il modulo mod_cache e uno dei suoi provider di caching. Come abbiamo detto sopra, mod_cache_disk è ben testato, quindi ci affideremo a quello.

Abilitare i moduli

Su un sistema Ubuntu, puoi abilitare questi moduli digitando:

  • sudo a2enmod cache
  • sudo a2enmod cache_disk

Questo abiliterà la funzionalità di caching al prossimo riavvio del server.

Avrete anche bisogno di installare il pacchetto apache2-utils, che contiene l’utilità htcacheclean usata per ridurre la cache quando necessario. Puoi installarlo digitando:

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

Modificare la configurazione globale

La maggior parte della configurazione della cache avverrà all’interno delle definizioni dei singoli host virtuali o dei blocchi di localizzazione. Tuttavia, abilitando mod_cache_disk si abilita anche una configurazione globale che può essere usata per specificare alcuni attributi generali. Apri quel file ora per dare un’occhiata:

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

Con i commenti rimossi, il file dovrebbe assomigliare a questo:

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

Il wrapper IfModule dice ad Apache di preoccuparsi di queste direttive solo se il modulo mod_cache_disk è attivato. La direttiva CacheRoot specifica la posizione su disco dove la cache sarà mantenuta. Le direttive CacheDirLevels e CacheDirLength contribuiscono entrambe a definire come sarà costruita la struttura della directory della cache.

Un hash md5 dell’URL servito sarà creato come chiave utilizzata per memorizzare i dati. I dati saranno organizzati in directory derivate dai caratteri iniziali di ogni hash. CacheDirLevels specifica il numero di sottodirectory da creare e CacheDirLength specifica quanti caratteri usare come nome di ogni directory. Quindi un hash di b1946ac92492d2347c6235b4d2611184 con i valori predefiniti mostrati sopra verrebbe archiviato in una struttura di directory di b/1/946ac92492d2347c6235b4d2611184. Di solito, non avrai bisogno di modificare questi valori, ma è bene sapere per cosa sono usati.

Nota

Se scegli di modificare il valoreCacheRoot, dovrai aprire il file/etc/default/apache2e modificare il valore diHTCACHECLEAN_PATHper farlo corrispondere alla tua selezione. Questo è usato per pulire la cache a intervalli regolari, quindi deve avere la posizione corretta della cache.

Altri valori che puoi impostare in questo file sono CacheMaxFileSize e CacheMinFileSize che impostano gli intervalli di dimensioni dei file in byte che Apache impegnerà nella cache, così come CacheReadSize e CacheReadTime, che ti permette di aspettare e bufferizzare il contenuto prima dell’invio al client. Questo può essere utile se il contenuto risiede da qualche altra parte rispetto a questo server.

Modificare il server virtuale

La maggior parte della configurazione per la cache avverrà ad un livello più granulare, o nella definizione dell’host virtuale o in un blocco di posizione specifico.

Apri uno dei tuoi file di host virtuale per seguirlo. Assumiamo che tu stia usando il file di default in questa guida:

  • sudo nano /etc/apache2/sites-enabled

Nel blocco dell’host virtuale, al di fuori di qualsiasi blocco di locazione, possiamo iniziare a configurare alcune delle proprietà di caching. In questa guida, assumeremo che vogliamo disattivare il CacheQuickHandler in modo che venga fatta più elaborazione. Questo ci permette regole di caching più complete.

Abbiamo anche colto l’occasione per configurare il blocco della cache. Questo è un sistema di blocco dei file che Apache userà quando sta controllando l’origine del contenuto per vedere se il contenuto è ancora valido. Durante il tempo in cui questa query viene soddisfatta, se arrivano altre richieste per lo stesso contenuto, ciò comporterebbe ulteriori richieste alla risorsa di backend, il che potrebbe causare picchi di carico.

Impostare un blocco della cache per una risorsa durante la validazione dice ad Apache che la risorsa è attualmente in fase di aggiornamento. Durante questo periodo, la risorsa stantia può essere servita con un’intestazione di avviso che indica il suo stato. Lo imposteremo con una directory di blocco della cache nella cartella /tmp. Permetteremo un massimo di 5 secondi perché un blocco sia considerato valido. Questi esempi sono presi direttamente dalla documentazione di Apache, quindi dovrebbero funzionare bene per i nostri scopi.

Diremo anche ad Apache di ignorare gli header Set-Cookie e non memorizzarli nella cache. Facendo così si impedirà ad Apache di far trapelare accidentalmente i cookie specifici dell’utente ad altre parti. L’intestazione Set-Cookie sarà rimossa prima che le intestazioni siano memorizzate nella cache.

/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>

Dobbiamo ancora abilitare la cache per questo host virtuale. Possiamo farlo con la direttiva CacheEnable. Se questa è impostata in un blocco di host virtuale, dovremmo fornire il metodo di caching (disk o socache) così come gli URI richiesti che dovrebbero essere messi in cache. Per esempio, per mettere in cache tutte le risposte, questo potrebbe essere impostato a CacheEnable disk /, ma se si volesse mettere in cache solo le risposte sotto l’URI /public, si potrebbe impostarlo a CacheEnable disk /public.

Prendiamo una strada diversa abilitando la nostra cache all’interno di un blocco di località specifico. Fare ciò significa che non dobbiamo fornire un percorso URI al comando CacheEnable. Qualsiasi URI che verrebbe servito da quella posizione verrà memorizzato nella cache. Attiveremo anche la direttiva CacheHeader in modo che le nostre intestazioni di risposta indichino se la cache è stata usata per servire la richiesta o meno.

Un’altra direttiva che imposteremo è CacheDefaultExpire in modo che possiamo impostare una scadenza (in secondi) se né le intestazioni Expires né le Last-Modified sono impostate sul contenuto. Allo stesso modo, imposteremo CacheMaxExpire per limitare la quantità di tempo in cui gli elementi saranno salvati. Imposteremo il CacheLastModifiedFactor in modo che Apache possa creare una data di scadenza se ha una data Last-Modified, ma nessuna scadenza. Il fattore viene moltiplicato per il tempo trascorso dalla modifica per impostare una scadenza ragionevole.

/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>

Salva e chiudi il tuo file quando hai configurato tutto ciò che ti serve.

Controlla l’intera configurazione per errori di sintassi digitando:

  • sudo apachectl configtest

Se non vengono segnalati errori, riavvia il servizio digitando:

  • sudo service apache2 restart

Impostazione delle scadenze e degli header di caching sul contenuto

Nella configurazione precedente, abbiamo configurato il caching HTTP, che si basa sugli header HTTP. Tuttavia, nessuno dei contenuti che stiamo servendo ha effettivamente le intestazioni Expires o Cache-Control necessarie per prendere decisioni intelligenti di caching. Per impostare queste intestazioni, dobbiamo approfittare di qualche altro modulo.

Il modulo mod_expires può impostare sia l’intestazione Expires che l’opzione max-age nell’intestazione Cache-Control. Il modulo mod_headers può essere usato per aggiungere opzioni Cache-Control più specifiche per sintonizzare ulteriormente la politica di caching.

Possiamo abilitare entrambi questi moduli digitando:

  • sudo a2enmod expires
  • sudo a2enmod headers

Dopo aver abilitato questi moduli, possiamo passare direttamente alla modifica del nostro file host virtuale:

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

Il modulo mod_expires fornisce solo tre direttive. La ExpiresActive attiva l’elaborazione delle scadenze in un certo contesto impostandola su “on”. Le altre due direttive sono molto simili tra loro. La direttiva ExpiresDefault imposta il tempo di scadenza predefinito, e la ExpiresByType imposta il tempo di scadenza secondo il tipo MIME del contenuto. Entrambe impostano il Expires e il Cache-Control “max-age” ai valori corretti.

Queste due impostazioni possono avere due sintassi diverse. La prima è semplicemente “A” o “M” seguita da un numero di secondi. Questo imposta la scadenza in relazione all’ultima volta che il contenuto è stato “accesso” o “modificato” rispettivamente. Per esempio, entrambi farebbero scadere il contenuto 30 secondi dopo l’accesso.

ExpiresDefault A30ExpireByType text/html A30

L’altra sintassi permette una configurazione più verbosa. Ti permette di usare unità diverse dai secondi che sono più facili da calcolare per gli esseri umani. Usa anche la parola completa “accesso” o “modifica”. L’intera configurazione della scadenza dovrebbe essere tenuta tra virgolette, come questa:

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

Per i nostri scopi, imposteremo solo una scadenza predefinita. Inizieremo impostandola a 5 minuti, in modo che se facciamo un errore mentre prendiamo confidenza, non sarà memorizzata sui computer dei nostri clienti per un tempo estremamente lungo. Quando saremo più sicuri della nostra capacità di selezionare politiche appropriate per il nostro contenuto, potremo aggiustare questo a qualcosa di più aggressivo:

/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>

Questo imposterà il nostro header Expires a cinque minuti nel futuro e imposterà Cache-Control max-age=300. Per raffinare ulteriormente la nostra politica di caching, possiamo usare la direttiva Header. Possiamo usare l’opzione merge per aggiungere ulteriori opzioni Cache-Control. Puoi chiamare questa direttiva più volte e aggiungere tutte le politiche aggiuntive che vuoi. Dai un’occhiata a questa guida per avere un’idea delle politiche di caching che vorresti impostare per il tuo contenuto. Per il nostro esempio, imposteremo solo “public” in modo che le altre cache possano essere sicure di poter memorizzare delle copie.

Per impostare ETags per il contenuto statico del nostro sito (da usare per la validazione), possiamo usare la direttiva FileETag. Questo funzionerà per il contenuto statico. Per il contenuto generato dinamicamente, la tua applicazione sarà responsabile della corretta generazione di ETags.

Utilizziamo la direttiva per impostare gli attributi che Apache userà per calcolare il Etag. Questo può essere INode, MTime, Size, o All a seconda se vogliamo modificare il ETag ogni volta che il inode del file cambia, il suo tempo di modifica cambia, la sua dimensione cambia, o tutto questo. Potete fornire più di un valore, e potete modificare l’impostazione ereditata nei contesti figli facendo precedere le nuove impostazioni da un + o -. Per i nostri scopi, useremo solo “all” in modo che tutti i cambiamenti siano registrati:

/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>

Questo aggiungerà “public” (separato da una virgola) a qualsiasi valore Cache-Control abbia già e includerà un ETag per il nostro contenuto statico.

Quando hai finito, salva e chiudi il file. Controlla la sintassi delle tue modifiche digitando:

  • sudo apachectl configtest

Se non sono stati trovati errori, riavvia il servizio per implementare le tue politiche di caching:

  • sudo service apache2 restart

Conclusione

Configurare il caching con Apache può sembrare un lavoro scoraggiante a causa di quante opzioni ci sono. Fortunatamente, è facile iniziare in modo semplice e poi crescere man mano che si richiede più complessità. La maggior parte degli amministratori non richiederà tutti i tipi di caching.

Quando si configura il caching, tenere a mente i problemi specifici che si sta cercando di risolvere per evitare di perdersi nelle diverse scelte di implementazione. La maggior parte degli utenti trarrà beneficio almeno dalla configurazione delle intestazioni. Se stai facendo il proxy o generando contenuti, impostare una cache HTTP può essere utile. La cache di oggetti condivisi è utile per compiti specifici come la memorizzazione delle sessioni SSL o dei dettagli di autenticazione se si sta utilizzando un provider di backend. La cache dei file può probabilmente essere limitata a quelli con sistemi lenti.

Leave a Reply