Indice dei contenuti dell'articolo:
Varnish Cache è una tecnologia software estremamente potente e flessibile, ampiamente utilizzata come acceleratore HTTP. Questo strumento agisce come un intermediario tra il server e il client, immagazzinando dati (o “caching”) per ridurre il carico sul server e fornire risposte più veloci ai client.
I vantaggi di Varnish Cache.
I vantaggi di Varnish Cache sono molteplici. Prima di tutto, aumenta notevolmente le prestazioni del sito web riducendo il tempo di caricamento delle pagine e risparmiando risorse server. In secondo luogo, migliora la scalabilità dei siti web permettendo di gestire un numero maggiore di richieste contemporaneamente. Infine, offre una flessibilità senza pari grazie al suo linguaggio di configurazione VCL (Varnish Configuration Language), che consente di definire regole di caching specifiche per ogni caso.
Varnish ed il TTFB
Varnish Cache ha un impatto significativo sul Tempo di Primo Byte (TTFB), un indicatore chiave delle prestazioni del sito web. Il TTFB è il tempo che intercorre tra il momento in cui un client (come un browser web) invia una richiesta HTTP e il momento in cui riceve il primo byte di dati dal server. Varnish Cache riduce drasticamente il TTFB immagazzinando le risposte del server e fornendole rapidamente ai client, evitando la necessità di processare nuovamente le richieste.
Un TTFB più basso significa che il contenuto viene fornito agli utenti più velocemente, migliorando l’esperienza utente e la percezione della velocità del sito. Ma non è solo l’esperienza utente a beneficiarne: anche i motori di ricerca come Google apprezzano i tempi di risposta più rapidi.
Varnish ed il crawl Budget di Google
Google utilizza una risorsa limitata, conosciuta come “crawl budget”, per indicizzare i siti web. Questo budget è il numero di pagine che Google è in grado di e disposto a esplorare in un determinato periodo di tempo. Un TTFB più basso significa che Google può esplorare e indicizzare più pagine entro questo budget, ottimizzando l’uso delle sue risorse di scansione.
Migliorare il crawl budget può avere un impatto diretto sulla capacità di Google di indicizzare il tuo sito web in modo tempestivo. Questo, a sua volta, può influenzare positivamente il posizionamento del tuo sito nei risultati di ricerca, poiché un’indicizzazione più completa e tempestiva fornisce a Google una visione più accurata del tuo sito e del suo contenuto. In questo modo, l’uso di Varnish Cache può contribuire a migliorare sia la velocità del sito che il suo posizionamento nei risultati di ricerca.
Siti web di alto profilo come The New York Times, BBC, Wikipedia hanno già adottato Varnish Cache per migliorare le loro prestazioni e garantire un’esperienza utente fluida e reattiva.
Varnish e WordPress
WordPress è la piattaforma di blogging più popolare al mondo e Varnish Cache si adatta perfettamente alle sue esigenze. Tuttavia, la gestione di Varnish Cache in un ambiente WordPress può essere complicata. Fortunatamente, ci sono diversi plugin disponibili che possono aiutare in questo processo, tra cui W3 Total Cache e Varnish HTTP Purge.
Nonostante la loro utilità, questi plugin possono presentare dei seri problemi.
W3 Total Cache, ad esempio, può essere estremamente lento nel pulire la cache, specialmente quando si tratta di categorie multiple. Questo può portare a ritardi significativi nella pubblicazione dei post, interferendo con l’attività editoriale e potenzialmente causando errori come Gateway Timeout.
Varnish HTTP Purge, pur essendo più snello e focalizzato sulla sola funzione di pulizia della cache, ha dimostrato in diverse occasioni di essere inaffidabile. Invece di pulire la cache in modo selettivo e granulare, spesso pulisce l’intera cache, il che può avere un impatto significativo sulle prestazioni del sito.
Per risolvere questi problemi, proponiamo uno snippet di codice PHP da inserire nel file functions.php del vostro tema attivo WordPress. Questo codice si occupa di pulire la cache Varnish ogni volta che viene pubblicato un post (ad eccezione delle bozze), garantendo che la home page, l’articolo stesso e tutte le categorie correlate vengano correttamente aggiornate.
Il codice proposto non pretende di trattare installazioni WordPress con WooCommerce installato, tassonomie prodotti, tag AMP o API; tuttavia, è piuttosto semplice da comprendere e facilmente estendibile per adattarsi alle più disparate esigenze.
Il Codice PHP per WordPress per fare il PURGE di Varnish.
// Funzione che pulisce la Cache Varnish tramite metodo PURGE su socket RAW senza l'utilizzo di cURL function purgeURL($URL) { $varnishIP = "127.0.0.1"; $varnishPORT = "80"; $hostwp = trim(str_replace( array( 'http://', 'https://' ), '', get_option('siteurl')), '/' ); // Open the socket $errno = ( integer) ""; $errstr = ( string) ""; $varnish_sock = fsockopen( "127.0.0.1", "$varnishPORT", $errno, $errstr, 10); // Prepare command to send $cmd = "PURGE $URL HTTP/1.0\r\n"; $cmd .= "Host: $hostwp\r\n"; $cmd .= "Connection: Close\r\n"; $cmd .= "\r\n"; // Send the request fwrite( $varnish_sock, $cmd); // Close the socket fclose( $varnish_sock); } // In fase di salvataggio POST recupero gli slug delle categorie che contengono il post, ed invoco la pulizia della cache Varnish // tramite la funziona purgeURL function pulisci_cache_categorie ($post_id){ if ( wp_is_post_revision( $post_id ) ) { return; } $categories = get_the_category($post_id); // Inizializzare un array vuoto per i permalink $relative_permalinks = array(); // Iterare su ogni categoria foreach ($categories as $category) { // Ottenere il permalink della categoria e convertirlo in un URL relativo $relative_permalink = wp_make_link_relative(get_category_link($category->term_id)); // Aggiungere l'URL relativo all'array $relative_permalinks[] = $relative_permalink; } foreach($relative_permalinks as $relative_permalink) { purgeURL ($relative_permalink); } } add_action( 'save_post', 'pulisci_cache_categorie' );
Il codice fornito è scritto in PHP e fa parte del file functions.php
di un tema WordPress. Questo codice definisce due funzioni: purgeURL()
e pulisci_cache_categorie()
.
purgeURL($URL)
: Questa funzione è progettata per interfacciarsi con un server Varnish, un acceleratore di applicazioni web molto potente, per invalidare o “pulire” una particolare URL dalla cache. Il server Varnish è configurato per risiedere in locale (“127.0.0.1”) e comunicare sulla porta 80. La funzione crea una connessione socket con il server Varnish e invia un comando “PURGE” per l’URL specificato. Questo comando dice a Varnish di rimuovere qualsiasi cache corrispondente a quell’URL, costringendo Varnish a recuperare una nuova copia della pagina la prossima volta che viene richiesta. Dopo aver inviato il comando, la funzione chiude la connessione socket.pulisci_cache_categorie($post_id)
: Questa funzione è collegata all’azione WordPress ‘save_post’, che si attiva ogni volta che un post viene salvato. Quando un post viene salvato, questa funzione viene chiamata con l’ID del post come argomento. Se il post è una revisione (cioè, non è la versione “live” del post), la funzione termina subito. Altrimenti, recupera tutte le categorie a cui il post appartiene e costruisce un array di URL relative corrispondenti a queste categorie. Per ciascuna di queste URL, chiama la funzionepurgeURL()
, causando la rimozione di queste pagine dalla cache Varnish. Questo assicura che, quando un post viene modificato, tutte le pagine delle categorie che includono quel post vengono aggiornate nella cache, riflettendo così le modifiche al post.
Queste funzioni lavorano insieme per assicurarsi che le modifiche ai post in WordPress vengano riflesse tempestivamente nelle pagine delle categorie, pur mantenendo i vantaggi delle prestazioni di una cache web come Varnish.
Un occhio di riguardo alle prestazioni grazie a fsockopen().
Nel contesto delle chiamate di rete in PHP, fsockopen()
e cURL sono due metodi popolari per effettuare richieste HTTP. Mentre cURL è noto per la sua versatilità e l’ampia gamma di opzioni di configurazione, fsockopen()
può offrire vantaggi in termini di velocità in determinati scenari.
fsockopen()
apre un socket diretto a un server, permettendo una comunicazione a basso livello più veloce e meno pesante dal punto di vista delle risorse. Questo può essere particolarmente vantaggioso quando si effettuano molte richieste simultanee o si hanno esigenze di latenza molto bassa. Inoltre, fsockopen()
può essere più veloce nelle situazioni in cui la risposta del server non è necessaria o può essere ignorata, poiché non è necessario aspettare che la risposta venga restituita e processata come sarebbe con cURL.