Caching Apache · 5 min read · Dec 28, 2025

Caching Con mod_cache di Apache Su Debian Lenny

Caching Con mod_cache di Apache Su Debian Lenny

Versione 1.0
Autore: Falko Timme
Seguimi su Twitter

Questo articolo spiega come puoi memorizzare nella cache i contenuti del tuo sito web con mod_cache di Apache su Debian Lenny. Se hai un sito web dinamico ad alto traffico che genera molte query al database ad ogni richiesta, puoi ridurre notevolmente il carico del server memorizzando nella cache i tuoi contenuti per alcuni minuti o più (questo dipende da quanto spesso aggiorni i tuoi contenuti).

Non fornisco alcuna garanzia che questo funzionerà per te!

1 Nota Preliminare

Presumo che tu abbia una configurazione funzionante di Apache2 (Apache 2.2.x - prima di quella versione, mod_cache è considerato sperimentale) dai repository Debian - la versione di Apache nei repository Debian Lenny è 2.2.9, quindi dovresti essere a posto.

Sto usando la root del documento /var/www qui per il mio vhost di test - devi regolare questo se la tua root del documento è diversa.

2 Abilitare mod_cache

mod_cache ha due sottomoduli che gestiscono la memorizzazione nella cache, mod_disk_cache (per memorizzare i contenuti su disco rigido) e mod_mem_cache (per memorizzare i contenuti in memoria, che è più veloce della memorizzazione nella cache su disco). Decidi quale vuoi usare e continua con il capitolo 2.1 (mod_disk_cache) o 2.2 (mod_mem_cache).

2.1 mod_disk_cache

La configurazione di mod_disk_cache è memorizzata in /etc/apache2/mods-available/disk_cache.conf, quindi modifichiamo quello:

vi /etc/apache2/mods-available/disk_cache.conf

Assicurati di decommentare la linea CacheEnable disk /, in modo che la configurazione minima appaia come segue:

| # la pulizia della cache è effettuata da htcacheclean, che può essere configurato in # /etc/default/apache2 # # Per ulteriori informazioni, vedere i commenti in quel file, # /usr/share/doc/apache2.2-common/README.Debian, e la pagina man htcacheclean(8) # Questo percorso deve essere lo stesso di quello in /etc/default/apache2 CacheRoot /var/cache/apache2/mod_disk_cache # Questo memorizzerà anche documenti locali. Di solito ha più senso # metterlo nella configurazione per un solo host virtuale. CacheEnable disk / CacheDirLevels 5 CacheDirLength 3 |

Puoi trovare spiegazioni per queste opzioni di configurazione e ulteriori opzioni di configurazione su http://httpd.apache.org/docs/2.2/mod/mod_disk_cache.html.

Ora possiamo abilitare mod_cache e mod_disk_cache:

a2enmod cache
a2enmod disk_cache

/etc/init.d/apache2 restart 

Per assicurarci che la nostra directory di cache /var/cache/apache2/mod_disk_cache non si riempia nel tempo, dobbiamo pulirla con il comando htcacheclean. Quel comando fa parte del pacchetto apache2-utils che installiamo come segue:

aptitude install apache2-utils 

Dopo, possiamo avviare htcacheclean come un demone in questo modo:

htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -i

Questo pulirà la nostra directory di cache ogni 30 minuti e assicurerà che non superi i 100MB. Per saperne di più su htcacheclean, dai un’occhiata a

man htcacheclean

Certo, non vuoi avviare htcacheclean manualmente ogni volta che riavvii il server - quindi modifichiamo /etc/rc.local…

vi /etc/rc.local

… e aggiungiamo la seguente riga, subito prima della linea exit 0:

| [...] /usr/sbin/htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -i [...] |

Questo avvierà htcacheclean automaticamente ogni volta che avvii il server.

2.2 mod_mem_cache

La configurazione di mod_mem_cache si trova in /etc/apache2/mods-available/mem_cache.conf:

vi /etc/apache2/mods-available/mem_cache.conf   

| CacheEnable mem / MCacheSize 4096 MCacheMaxObjectCount 100 MCacheMinObjectSize 1 MCacheMaxObjectSize 2048 |

Questa è la configurazione predefinita - se vuoi puoi modificarla. Un elenco delle direttive di configurazione per mod_mem_cache è disponibile qui: http://httpd.apache.org/docs/2.2/mod/mod_mem_cache.html

Ora abilitiamo mod_cache e mod_mem_cache come segue:

a2enmod cache
a2enmod mem_cache

/etc/init.d/apache2 restart

Ecco fatto! Con mod_mem_cache, non devi pulire alcuna directory di cache.

3 Test

Sfortunatamente mod_cache non fornisce alcuna funzionalità di registrazione, il che è un peccato se vuoi sapere se la registrazione funziona. Pertanto, creo un piccolo file di test PHP, /var/www/cachetest.php, che invia intestazioni HTTP che dicono a mod_cache che dovrebbe memorizzare nella cache il file per 300 secondi e che semplicemente stampa il timestamp:

vi /var/www/cachetest.php

| "; ?> |

Ora chiama quel file in un browser - dovrebbe visualizzare il timestamp corrente. Poi clicca nella barra degli indirizzi del browser e premi INVIO in modo che la pagina venga ricaricata (non premere F5 o il pulsante di ricarica - questo recupererà sempre una copia fresca dal server invece che dalla cache!) - se tutto va bene, dovresti ancora vedere il vecchio timestamp memorizzato nella cache. Se aspetti 300 secondi, dovresti ricevere una copia fresca dal server invece che dalla cache.

4 Intestazioni HTTP

La memorizzazione nella cache non funziona automaticamente - devi modificare la tua applicazione web affinché la memorizzazione nella cache possa funzionare (è possibile che la tua applicazione web supporti già la memorizzazione nella cache - consulta la documentazione della tua applicazione per scoprirlo). mod_cache memorizzerà nella cache le pagine web solo se le intestazioni HTTP inviate dalla tua applicazione web lo dicono.

Ecco alcuni esempi di intestazioni che dicono a mod_cache di non memorizzare nella cache:

  • Intestazioni Expires con una data nel passato: “Expires: Sun, 19 Nov 1978 05:00:00 GMT”
  • Alcune intestazioni Cache-Control: “Cache-Control: no-store, no-cache, must-revalidate” o “Cache-Control: must-revalidate, max-age=0”
  • Intestazioni Set-Cookie: una pagina non sarà memorizzata nella cache se viene impostato un cookie.

Quindi, se vuoi che mod_cache memorizzi nella cache le tue pagine, modifica la tua applicazione per non inviare tali intestazioni.

Se vuoi che mod_cache memorizzi nella cache le tue pagine, puoi impostare un’intestazione Expires con una data nel futuro, ma il modo raccomandato è utilizzare max-age:

"Cache-Control: must-revalidate, max-age=300"

Questo dice a mod_cache di memorizzare nella cache la pagina per 300 secondi (max-age) - sfortunatamente mod_cache non conosce l’opzione s-maxage (vedi http://www.mnot.net/cache_docs/#CACHE-CONTROL), ecco perché dobbiamo usare l’opzione max-age (che dice anche al tuo browser di memorizzare nella cache - tieni presente questo se ottieni risultati inaspettati!). Se mod_cache conoscesse l’opzione s-maxage, potremmo usare “Cache-Control: must-revalidate, max-age=0, s-maxage=300” che direbbe a mod_cache, ma non al browser, di memorizzare nella cache la pagina.

Certo, questa intestazione è inutile se invii una delle intestazioni non di memorizzazione nella cache (Expires nel passato, Set-Cookie, ecc.) contemporaneamente!

Un’altra intestazione molto importante per la memorizzazione nella cache è questa:

"Vary: Accept-Encoding"

Questo fa sì che mod_cache mantenga due copie di ogni pagina memorizzata nella cache, una compressa (gzip) e una non compressa in modo che possa fornire la versione giusta a seconda delle capacità dell’user-agent/browser. Alcuni user-agent non comprendono la compressione gzip, quindi dovrebbero ricevere la versione non compressa.

Quindi ecco il riassunto: usa le seguenti due intestazioni se vuoi che mod_cache memorizzi nella cache:

“Cache-Control: must-revalidate, max-age=300”
“Vary: Accept-Encoding”

e assicurati che non vengano inviate intestazioni Expires con una data nel passato, cookie, ecc.

Se la tua applicazione è scritta in PHP, puoi usare la funzione header() di PHP per inviare intestazioni HTTP, ad esempio in questo modo:

header(“Cache-Control: must-revalidate, max-age=300”);
header(“Vary: Accept-Encoding”);

Questa pagina è un must-read se vuoi saperne di più sulle intestazioni HTTP e sulla memorizzazione nella cache: http://www.mnot.net/cache_docs/

5 Link

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.