Migliorare le prestazioni del sito web abilitando la cache in Apache

Panoramica

La maggior parte dei siti web ha grandi quantità di contenuto che rimane invariato o viene modificato raramente dopo la pubblicazione. E ogni volta che viene richiesto al server web, modificato o meno, viene rielaborato e trasmesso al client, consumando inutilmente preziose risorse di sistema e banda di rete. Man mano che il tuo sito web o la tua applicazione aumenta di popolarità, il tuo server è chiamato a elaborare contenuti che, sebbene generati dinamicamente, sono statici.

Questo non è un uso efficiente delle risorse e finirà per costarti un sacco di soldi, dato che installerai più hardware per tenere il passo con il carico. È qui che entra in gioco il caching. Non sprechiamo cicli di CPU o di RAM per elaborare contenuti precedentemente acceduti che è improbabile che cambino entro un determinato periodo di tempo. Invece, serviremo contenuti pre-elaborati, temporaneamente memorizzati sul server o nella cache del browser web. E solo dopo che il contenuto è stato modificato o è passato un determinato lasso di tempo, il contenuto richiesto verrà rielaborato.

Configurare la cache in Apache

Apache è dotato di tre moduli per la cache dei contenuti, uno lo abilita e gli altri due determinano dove esiste il deposito della cache – su disco o in memoria. Determinare quale modulo usare per il deposito della cache dipende dalle risorse hardware disponibili e dalle esigenze di prestazione.

Servire da disco è lento ma meno costoso. Servire dalla memoria è veloce, ma costoso, sia in termini di costo che di consumo di risorse. Tuttavia, è possibile aumentare le prestazioni della cache su disco posizionandola sulla memoria SSDFLASH invece del tradizionale disco rotante.

  1. Assicurati che il modulo cache_ venga caricato da Apache, verificando che la seguente linea esista nel file di configurazione del server di Apache, non commentata.
    LoadModule cache_module modules/mod_cache.so
  2. Per la cache su disco, assicurati che il modulo disk_cache_module venga caricato da Apache. Cerca la seguente linea, non commentata.
    LoadModule disk_cache_module modules/mod_disk_cache.so
  3. Aggiungi le seguenti linee nel file di configurazione del server Apache (per globale) o all’interno di una direttiva VirtualHost (applicazione localizzata).
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-admin

    CacheEnable disk /

    Inabilita la cache su disco per la directory relativa “/”.

    Cacheroot

    Imposta la directory di memorizzazione della cache, dove verrà salvato tutto il contenuto della cache.

    CacheDefaultExpire

    Imposta la data di scadenza predefinita, relativa alla data della richiesta originale, in secondi.

    CacheDisable

    Disattiva la cache per i percorsi relativi seguendo l’opzione. Le aree sensibili e quelle che non dovrebbero essere memorizzate nella cache dovrebbero essere aggiunte qui.

Impostazione della scadenza del contenuto

La cache richiede una data di scadenza per funzionare. Senza una data di scadenza sul tuo contenuto, la cache non può determinare se è stantio o meno.

Utilizza il Mod_Expires di Apache

Questo modulo ti permette di definire le date di scadenza per il tuo contenuto, nel suo insieme o individualmente in base al tipo o alla stringa corrispondente.

  1. Assicurati che il modulo sia caricato in Apache. Aprite il file di configurazione del server (httpd.conf in CentOS) e cercate questa linea. Scomponila, se è commentata con un ‘#’.
    LoadModule expires_module modules/mod_expires.so
  2. Aggiungi le seguenti linee alla configurazione del server Apache, alla configurazione di un host virtuale, a una direttiva di directory o a .htaccess, a seconda di dove volete impostare la vostra politica di caching.
    <IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day"</IfModule></pre>

    ExpiresActive On

    Attiva le scadenze mod.

    ExpiresDefault

    Imposta la data di scadenza predefinita per tutti i contenuti. Access plus 1 day imposta la scadenza all’ora di accesso del contenuto + 1 giorno, il che significa che sarà nella cache per 24 ore.

  3. Se vuoi assegnare diversi valori di scadenza a specifici tipi di contenuto, puoi usare l’opzione ExpiresByType, oltre o senza l’opzione ExpiresDefault. Ecco alcuni esempi:
    <IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day" ExpiresByType image/jpg "access plus 5 days" ExpiresByType image/jpeg "access plus 5 days" ExpiresByType image/gif "access plus 5 days" ExpiresByType image/png "access plus 5 days" ExpiresByType text/css "access plus 1 month" ExpiresByType application/pdf "access plus 1 month" ExpiresByType text/x-javascript "access plus 1 month" ExpiresByType application/x-shockwave-flash "access plus 1 month" ExpiresByType image/x-icon "access plus 1 year"</IfModule>

Utilizzare le intestazioni HTTP nell’applicazione web

Le date di scadenza e di ultima modifica possono essere definite dall’applicazione web utilizzando i parametri dell’intestazione HTTP. Questo dà il controllo della freschezza del contenuto agli sviluppatori o all’applicazione. Il modo in cui lo fai dipende dalla tua applicazione.

  • HTML
    Usa il tag Meta e definisci l’età del contenuto. Nell’esempio qui sotto, imposta la cache su privato (solo client richiedente) e l’età massima a 1 ora (3600 secondi).
    <meta http-equiv="Cache-control" content="private,max-age:3600">
  • PHP
    Usa la funzione Header() per impostare l’età del contenuto nell’intestazione dei documenti.
    header("Cache-Control: private, max-age=3600");

Cache del contenuto non in scadenza

A volte hai bisogno di mettere in cache un contenuto che non ha una data di scadenza impostata. Come menzionato in precedenza, le date di scadenza sono un requisito per il funzionamento del meccanismo di caching, per impostazione predefinita. Tuttavia, possiamo istruire Apache ad aggiungere una data di scadenza predefinita ai contenuti che non hanno una data di scadenza definita, e metterli in cache. L’opzione CacheIgnoreNoLastMod ci permette di farlo.

  1. Aggiungi l’opzione CacheIgnoreNoLastMod con un valore di On alla posizione in cui hai abilitato la cache – il file di configurazione del server di Apache o un file di configurazione di Virtual Hosts.
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod On

Evitare che i browser facciano la cache dei contenuti

Il problema con le configurazioni di cache di cui sopra è che i contenuti della tua applicazione sono in cache in due posizioni: sul client e sul server. Se si aggiorna il contenuto e si vuole che l’utente lo veda immediatamente, potrebbe non essere in grado di farlo se la versione in cache locale non è scaduta. Puoi accorciare il tempo di scadenza, ma in tal caso potresti vanificare completamente lo scopo della cache.

Prendi il pieno controllo della cache, invece, abilitandola solo sul server. Forzare il browser web a ottenere il contenuto dal server per ogni richiesta, ma servire il contenuto Java o PHP pre-elaborato, per esempio, a meno che il contenuto non sia stato modificato. Questo assicura che l’utente veda sempre la versione più recente, mentre non spreca cicli di CPU o RAM rielaborando inutilmente.

  1. Aggiungi l’opzione CacheIgnoreCacheControl al luogo in cui la cache è abilitata – il file di configurazione del server di Apache o la configurazione di un host virtuale – con un valore di On . Questo fa sì che Apache ignori le richieste di aggiornamento dei contenuti del browser. Tutti i contenuti saranno serviti dalla cache del server, dove possibile, finché non sarà scaduta.
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod OnCacheIgnoreCacheControl On
  2. Salva le tue modifiche.
  3. Riavvia Apache per applicare le modifiche.

WordPress e altri framework applicativi

I framework, come quello di WordPress e quelli simili a CodeIgniter, indirizzano tutti i contenuti attraverso Index.php. A seconda di come avete scritto le vostre regole di mod_rewrite, il contenuto della cache verrà visualizzato in modo errato. Potresti trovare che i contenuti di una pagina richiesta, una categoria, ecc., appaiono al posto di ciò che è stato effettivamente richiesto.

Per combattere questo, dobbiamo assicurarci che la cache di Apache consideri i parametri aggiunti alla fine dell’index.php quando il contenuto viene messo in cache e tirato. Modificare la regola di riscrittura per index.php, come si vede nell’esempio qui sotto.

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

Lascia un commento