Come abbiamo già anticipato nella lezione precedente, il caching è uno dei passaggi fondamentali dell’ottimizzazione di un server. Ovunque ci sia una sorgente di dati cui fare accesso con frequenza, la presenza di un meccanismo di cache agisce memorizzando le informazioni su una memoria temporanea, e restituendole ai richiedenti quando possibile, in modo da ridurre gli accessi alla fonte primaria.
Un ruolo simile è vitale per le applicazioni web ad alto carico di lavoro, tanto che un meccanismo di caching è incorporato nei browser stessi.
In questa lezione vedremo come dotare il nostro server virtuale, basato su Aruba Cloud, di uno strumento che permette di abilitare un meccanismo di caching molto efficace. Varnish Cache è un prodotto molto conosciuto che svolge il ruolo di Reverse Proxy, ponendosi tra il server o il cluster di server e la rete Internet. Ha il compito di formare una barriera alle richieste provenienti dai client e, come effetto, produce un’accelerazione delle performance del sito web. Nella pratica, l’installazione di questo strumento farà sì che tutte le richieste in arrivo passeranno sempre prima da Varnish Cache, che deciderà se sarà necessario girare la richiesta al web server vero e proprio, o se evitare (fornendo una copia della risposta memorizzata in cache).
Nel seguito, faremo riferimento ad una configurazione LAMP del nostro server, di fatto ottimizzando l’esecuzione di un web server Apache. Come al solito, ci riferiremo ad Ubuntu 18.04.
Configurare Apache
Prima di procedere con l’installazione di Varnish Cache, abbiamo la necessità innanzitutto di modificare la porta di ascolto di Apache. Infatti, dovremo fare in modo che tutte le richieste destinate al web server, debbano in realtà arrivare prima a Varnish. Sarà quest’ultimo, se è il caso, ad inoltrarle ad Apache.
Supponendo di voler installare Varnish in modo che questo stia in ascolto sulla porta 80, modifichiamo la porta di ascolto di Apache agendo, con un editor di testo, sul file /etc/apache2/ports.conf. Qui, modifichiamo la riga relativa al comando Listen
come segue:
Listen 8080
Configurazione di Varnish Cache
L’installazione di Varnish può essere effettuata mediante il comando seguente:
$ apt install varnish
Di default, questo servizio gira sulla porta 6081, pertanto dovremo modificare questa impostazione facendo sì che la porta di ascolto diventi la 80.
Nel file /etc/varnish/default.vcl, cercheremo la configurazione del backend (che, nel gergo di Varnish, corrisponde nel nostro caso al web server Apache) che ha come pre-impostazione una forma simile:
backend default {
.host = "127.0.0.1";
.port = "8080";
}
Nel nostro caso, questa configurazione è già quella opportuna: il nostro backend è infatti installato in locale (indirizzo IP 127.0.0.1), ed è in ascolto sulla porta 8080. Nel caso utilizzassimo configurazioni diverse, potrebbe essere necessario modificare opportunamente questi parametri.
Esistono poi due punti della configurazione relativi all’avvio di Varnish in cui dovremo solo modificare il numero di porta su cui questo sarà in esecuzione, ovvero 80 piuttosto che 6081.
Il primo punto si trova nel file /etc/default/varnish e corrisponderà, dopo la modifica, a:
DAEMON_OPTS="-a :80 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
-s malloc,256m"
Il secondo, collocato nel file /lib/systemd/system/varnish.service, dopo la modifica diventerà:
ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
Riavviando il servizio avremo finalmente Varnish Cache in ascolto sulla 80 ed il suo backend, il web server Apache, sulla 8080:
$ systemctl daemon-reload
$ systemctl restart varnish
Osservando le porte in ascolto sul nostro server Aruba troviamo, tra le altre righe:
$ netstat –ltnp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
...
tcp 0 0 127.0.0.1:6082 0.0.0.0:* LISTEN 20160/varnishd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 20160/varnishd
tcp6 0 0 ::1:6082 :::* LISTEN 20160/varnishd
tcp6 0 0 :::80 :::* LISTEN 20160/varnishd
tcp6 0 0 :::8080 :::* LISTEN 19814/apache2
...
Un output simile al precedente ci confermerà la bontà della nostra configurazione.
Verifica della configurazione
Per verificare la nostra installazione, possiamo innanzitutto aprire un browser e contattare l’indirizzo IP del nostro web server. Il fatto che Varnish Cache sia in ascolto sulla porta 80 risulterà del tutto trasparente dal nostro punto di vista, e riceveremo una risposta analoga a quella che avremmo ricevuto dal web server Apache.
Per avere una migliore contezza di ciò che avviene dietro le quinte, potremo osservare gli header HTTP della risposta. A tale scopo, potremmo utilizzare un tool dedicato al monitoraggio HTTP come Postman. Utilizzandolo per accedere all’URL del nostro web server, otterremo tra i vari header anche quelli mostrati in figura seguente:
Gli header precedenti dimostrano il corretto funzionamento di Varnish Cache.
Varnish Cache è anche dotato di un utile strumento, varnishncsa
, che invocato da riga di comando permette di visualizzarne i log delle richieste HTTP ricevute:
$ varnishncsa
83.64.90.229 - - [15/May/2020:18:07:50 +0200] "GET http://80.211.140.227/ HTTP/1.1" 200 3138 "-" "PostmanRuntime/7.6.0"
Nel caso precedente, il nostro server ha indirizzo IP 80.211.140.227.
Potremmo proseguire con i nostri test effettuando altre prove ispirate dalla documentazione di Varnish.
Si consideri, tuttavia, che una delle prime operazioni da svolgere consiste nell’opportuna configurazione di un firewall - ad esempio, UFW - per evitare contatti al backend al di fuori di quello che Varnish Cache autorizza. Senza questo accorgimento, infatti, Apache rimarrebbe accessibile anche sulla porta 8080, bypassando totalmente l’azione del proxy.