Tutorial > Come installare Varnish Cache per velocizzare Apache su Ubuntu 20.04

Come installare Varnish Cache per velocizzare Apache su Ubuntu 20.04

Pubblicato il: 08 agosto 2022

Apache Cache Sviluppo Ubuntu Varnish

Introduzione

Varnish è un proxy HTTP di tipo reverse, ossia un proxy in grado di recuperare contenuti da server multipli e destinarli in un unico trasferimento a un client, dando la percezione di star comunicando con un server unico.

La capacità di Varnish è anche quella di salvare le risposte dei server alle richieste dei client in una memoria cache, per poter rispondere più velocemente alle richieste effettuate una seconda volta. Ciò viene fatto usando gli header HTTP per stabilire dove memorizzare le risposte alle richieste del client.

Varnish fornisce anche funzionalità di firewall, gestore del traffico web e routing HTTP.

Le locazioni dove poter salvare la cache HTTP sono tre:

  • Browser: la cache è salvata sul browser per permettere direttamente l'erogazione di contenuti già visualizzati piuttosto che richiederli nuovamente al sito web;
  • Proxy: il proxy è un server che funge da intermediario nella comunicazione client-server. Proprio per questo, permette di sfruttare la cache per memorizzare le risposte richieste da più utenti;
  • Reverse Proxy: questo tipo di proxy è creato dall'amministratore del sito web e serve a fornire i contenuti dalla rete invece che da una richiesta al server.

Nel tutorial, ti spiegheremo come impostare un reverse proxy usando Varnish.

Pre-Requisiti

Per seguire questo tutorial, dovrai disporre di:

  • Un server avente Ubuntu 20.04 come sistema operativo installato con almeno 2GB di RAM
  • Un utente non-root con privilegi sudo

Installare Varnish e Apache

Per cominciare, occorrerà installare Apache e Varnish. Inizia, quindi, con i comandi per installare Apache:

$ sudo apt-get update
$ sudo apt-get install apache2 -y

Il sistema dovrebbe confermare l'avvenuta installazione di Apache. Terminato ciò, passa a Varnish tramite:

$ sudo apt-get install varnish -y

Anche questa volta, otterrai un messaggio di conferma dell'avvenuta installazione.

Ora, sarà opportuno controllare l'integrità dei pacchetti installati. Partendo da Apache, inizia col comando :

$ sudo systemctl status apache2

L'output dovrebbe essere simile:

Stato di Apache

Premi il tasto Q per uscire dall'output e passare nuovamente all'inserimento nel terminale. E' il momento di passare, quindi, alla verifica dello stato di Varnish. Per far ciò, il comando sarà simile al precedente:

$ sudo systemctl status varnish

L'output dovrebbe essere simile:

Stato di Varnish

Verificato il corretto funzionamento di entrambi i software, puoi procedere con la configurazione di Varnish.

Configurazione di Varnish

La configurazione di Varnish serve a fornirgli qualcosa da servire ai client.

Il primo step è gestire le porte: Varnish, infatti, si pone in ascolto sulla porta 6081 e si connette a un server web locale sulla porta 8080. Questa configurazione va cambiata per servire il sito statico di Apache dal server di Apache.

Il primo step è cambiare la porta di Varnish dalla originaria alla 8080, avendo così Varnish sulla 8080 e Apache sulla 80.

Non ci sono file di configurazione per cambiare le opzioni delle porte per Varnish. Dovrai quindi creare una directory, chiamata varnish.service.d, da collocare nel percorso /etc/systemd/system/. In questa directory, potrai quindi creare un file di configurazione chiamato customexec.conf, all'interno del quale specificherai le opzioni per cambiare le porte su cui Varnish sarà in ascolto.

Partendo dalla creazione della directory, usa il comando:

$ sudo mkdir /etc/systemd/system/varnish.service.d

Da un qualunque editor di testi, crea il file di configurazione. Nell'esempio, usando nano, il comando sarà:

$ sudo nano /etc/systemd/system/varnish.service.d/customexec.conf

Una volta aperto il file, incolla al suo interno le seguenti righe di configurazione:

[Service]
ExecStart=
ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :8080 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m

Per spiegare la sintassi di questo file di configurazione, partiamo dal contestualizzare la sezione delle impostazioni di Varnish che verranno modificate. In questo caso, sarà la sezione Service.

Secondariamente, nelle specifiche, verrà azzerato il valore del parametro ExecStart per poi essere reimpostato con una nuova stringa di opzioni.

Analizzando la stringa:

  • -j: specifica il meccanismo di jailing da usare in Varnish. Il jail in Varnish viene usato per ridurre i permessi del processo di varnish. In questo caso, i permessi saranno ridotti tramite il meccanismo unix e l'utente vcache, come di default nei varnish installati su sistemi Ubuntu.
  • -F: indica che il server dovrebbe essere eseguito in foreground(ossia che la sua esecuzione dipende dall'invio di una riga di comando).
  • -a: questo flag, seguito da un indirizzo IP e una porta, serve a specificare da quali indirizzi e porte ricevere le connessioni dei client. Nel caso in cui tu non inserisca alcun indirizzo IP, Varnish si comporterà accettandoli tutti. Nella configurazione spiegata avrai, infatti, usato questo flag solamente per cambiare il numero di porta su cui Varnish sarà in ascolto.
  • -T: questo flag specifica l'indirizzo IP e la porta dedicata alla interfaccia gestionale. Nell'esempio sarà il localhost sulla porta 6082.
  • -f: questo flag specifica il file VCL di default per la configurazione di Varnish. Questo file verrà modificato dopo per collegare Varnish al server Apache.
  • -S: questo flag specifica un file segreto condiviso, nella directory /etc/varnish/secret che contiene dei valori indicanti le autorizzazioni per l'interfaccia gestionale
  • -s: questo flag indica dove e come salvare gli oggetti. Il valore malloc,256m è quello di default per Varnish. Ciò indica di salvare gli oggetti in memoria tramite la funzione malloc(allocazione nella memoria dinamica o heap memory). E' possibile, inoltre, specificare altre modalità di memorizzazione come:
    • default, che usa la funzione umem quando malloc non è disponibile
    • file, che salva gli oggetti nei file sul disco

Salva e chiudi il file di configurazione appena creato, dopodichè riavvia i servizi legati a systemd :

$ sudo systemctl daemon-reload

Riavvia, poi, Varnish per applicare i cambiamenti:

$ sudo systemctl restart varnish

Per effettuare ora un controllo dei cambiamenti effettuati, potrai ricorrere allo strumento netstat per controllare se Varnish sia in ascolto sulla porta 8080.

$ sudo netstat -ltnp | grep 8080

Eseguito il comando, dovresti avere un output simile:

Connessioni sulla porta 8080

Dall'output, potrai effettivamente leggere su quale porta Varnish sia in ascolto (ossia quella selezionata nella configurazione).

Ora che la porta di Varnish è stata configurata e verificata, dovrai modificare il file di configurazione generale. Tale file, chiamato default.vcl, si troverà nel percorso /etc/varnish/default.vcl.

Col tuo editor di testo, quindi, apri questo file di configurazione:

$ sudo nano /etc/varnish/default.vcl

All'interno del file, individua la sezione backend default e imposta il valore .port su 80. Ciò servirà a specificare che Apache debba essere in ascolto sulla porta 80.

Impostare porta 80 per Apache

Completata la configurazione, sarà necessario, come sempre, riavviare il servizio varnish:

$ sudo systemctl restart varnish

Se tutto sarà andato come deve, connettendoti all'indirizzo del tuo dominio, alla porta 8080, dovresti poter visualizzare la pagina statica di Apache, aperta usando Varnish.

Pagina statica di Apache

Terminati questi step, avrai:

  • Apache, in ascolto sulla porta 80
  • Varnish, in ascolto sulla porta 8080

A questo punto non ti resta che verificare e comparare i tempi di risposta di entrambi i server, per comprendere meglio come Varnish aiuti a velocizzare il "servire i contenuti" ai client.

Testare l'efficacia di Varnish con il tool wrk

Il tool wrk è un benchmark per il protocollo di comunicazione HTTP. Il suo funzionamento si basa sull'invio di numerose richieste al secondo ai server web per testarne i tempi di risposta.

Nel tuo caso, questo tool può tornarti utile proprio per scoprire come Varnish snellisca la risposta alle richieste dei client.

Inizia, quindi, installando alcuni tools per C e git. Essi saranno necessari per costruire wrk dal suo codice sorgente.

Il primo comando necessario sarà, quindi:

$ sudo apt-get install build-essential libssl-dev git unzip -y

Successivamente, dovrai clonare la repository di git nella directory wrk:

$ git clone https://github.com/wg/wrk.git wrk

Spostati ora nella directory appena creata e crea l'eseguibile di wrk:

$ cd wrk && make

Ora copia la directory nel percorso /usr/local/bin per permettere l'accesso a wrk ovunque nella tua gerarchia delle directory:

$ sudo cp wrk /usr/local/bin

Terminato ciò, il tool wrk sarà installato e pronto a essere utilizzato per testare i tempi di risposta dei tuoi server.

Iniziando da Apache, quindi, utilizza la stringa di comando:

$ wrk -t2 -c1000 -d30s --latency http://ipdelserver/

Analizzando gli elementi presenti nella sintassi della stringa:

  • -t2: lancia due thread
  • -c1000: mantieni 1000 connessioni HTTP aperte
  • -d30s: esegui il test per 30 secondi
  • -latency: stampa a video le statistiche sulla latenza

Dopo 30 secondi dal lancio del comando, dovresti ottenere un output simile:

Test tempi di risposta

Ripeti il test specificando lo stesso comando ma aggiungendo la porta 8080 come suffisso per specificare che tu voglia testare Varnish e non Apache:

$ wrk -t2 -c1000 -d30s --latency http://ipdelserver:8080/

L'ouput sarà simile:

Test di risposta Varnish

Potrai notare, generalmente, una latenza più bassa e minore presenza di errori in Varnish piuttosto che in Apache. Ciò è dovuto al fatto che Varnish, riducendo le letture dal disco grazie alla sua memoria cache, è capace di ridurre i tempi di risposta e il tasso di errore.

Conclusioni

Al termine di questo tutorial, sarai stato in grado di configurare Varnish come proxy inverso e avrai capito come configurare il caching HTTP per ridurre i tempi di risposta e gli errori, avvalorando la teoria grazie ai test del benchmark wrk.

Per approfondire le funzionalità di Varnish, visita la Documentazione Ufficiale di Varnish.