WordPress CDN per Agenzie: Configurazione Cloudflare, BunnyCDN e KeyCDN [2026]

3 settembre 202616 minPerformance

TL;DR: Quello che devi sapere sui CDN per WordPress

Un CDN riduce il tempo di caricamento del 30-60% per i visitatori lontani dal tuo server di origine. Per le agenzie che gestiscono decine di siti WordPress, un CDN ben configurato significa meno ticket di supporto, Core Web Vitals migliori e clienti più felici. Cloudflare Free copre il 90% dei casi. BunnyCDN costa pochissimo ed è ideale per siti ad alto traffico. KeyCDN resta un’opzione solida per chi vuole controllo granulare.

Nella nostra esperienza con AgencyPilot, abbiamo configurato CDN su oltre 50 siti clienti. Il pattern che funziona meglio non è “installa plugin e prega”. È configurazione mirata, regole di cache scritte a mano, e purge automatico alla pubblicazione. Vediamo come farlo bene.

Cos’è un CDN e perché i siti WordPress ne hanno bisogno

Un Content Delivery Network è una rete di server distribuiti geograficamente che memorizzano copie dei file statici del tuo sito: immagini, CSS, JavaScript, font. Quando un visitatore carica la pagina, questi file arrivano dal server più vicino (il PoP, Point of Presence) invece che dal tuo server di origine. Meno distanza fisica = meno latenza = pagina più veloce.

WordPress, di default, serve tutto dal server di origine. Questo significa che un utente a Roma aspetta i file da un server a Francoforte, e un utente a Buenos Aires aspetta gli stessi file da quello stesso server. Con 50 siti su hosting condiviso, la situazione peggiora: le risorse sono contese e il TTFB sale.

Un CDN risolve due problemi contemporaneamente:

  • Riduce la latenza per i visitatori geograficamente lontani dal server
  • Alleggerisce il carico sul server di origine, che non deve più servire ogni singolo asset statico

Per le agenzie che gestiscono portafogli di siti, questo si traduce in un beneficio concreto: meno richieste al server significa meno risorse consumate, che significa hosting più economico o più siti per lo stesso piano.

I due modelli di CDN per WordPress

Esistono due architetture fondamentali, e capire la differenza è critico prima di scegliere.

Reverse Proxy CDN (Cloudflare)

Tutto il traffico passa attraverso il CDN. Il CDN sta davanti al tuo server di origine e può memorizzare nella cache sia i file statici che le pagine HTML. Cloudflare usa questo modello: cambi i nameserver del dominio, e Cloudflare diventa il gateway per ogni richiesta.

Vantaggi: può memorizzare nella cache l’HTML delle pagine, DDoS protection inclusa, SSL automatico. Svantaggi: richiede configurazione attenta per evitare di servire pagine cached a utenti loggati o pagine di checkout WooCommerce. Se sbagli le regole di cache, servi il carrello di un cliente a un altro cliente.

Pull Zone CDN (BunnyCDN, KeyCDN)

Il sito si carica normalmente dal tuo hosting, ma gli URL degli asset statici vengono riscritti per puntare al CDN. BunnyCDN e KeyCDN usano questo approccio: non cambi nameserver, configuri il plugin per riscrivere gli URL di immagini, CSS e JS.

Vantaggi: setup più semplice, nessun rischio di cacheare HTML dinamico, isolamento completo tra CDN e logica del sito. Svantaggi: non puoi memorizzare nella cache le pagine HTML, solo i file statici. Per il caching HTML hai bisogno di un plugin di cache lato server.

Cloudflare per WordPress: Setup Completo

Cloudflare è la scelta più comune per WordPress. Il piano gratuito copre CDN base, protezione DDoS e SSL. Il piano Pro a $20/mese aggiunge WAF, ottimizzazione immagini e regole di cache avanzate.

Configurazione passo-passo

  1. Crea un account su cloudflare.com e aggiungi il dominio del cliente
  2. Cloudflare importa i record DNS esistenti. Verificali uno per uno prima di procedere
  3. Cambia i nameserver dal registrar del dominio ai due nameserver Cloudflare forniti
  4. Attendi la propagazione DNS (di solito sotto un’ora, ma può richiedere fino a 24 ore)
  5. Abilita il proxy (orange cloud) sui record che vuoi instradare tramite CDN
  6. Installa il plugin Cloudflare per WordPress dal repository ufficiale

Il plugin Cloudflare per WordPress è obbligatorio. Senza di quello, quando pubblichi un articolo o aggiorni una pagina, il CDN continua a servire la versione vecchia finché l’Edge Cache TTL non scade. Il plugin invia un purge automatico a Cloudflare ogni volta che pubblichi o modifichi un contenuto.

Regole di cache per WordPress

La configurazione di default di Cloudflare è conservativa: memorizza nella cache solo i file statici (CSS, JS, immagini) e non tocca l’HTML. Per ottenere un miglioramento reale sulle performance, devi scrivere regole di cache personalizzate.

Vai su Rules → Cache Rules nel dashboard Cloudflare e crea queste tre regole:

Regola 1 — Cache HTML per visitatori anonimi:

  • Match: URL path non contiene /wp-admin AND cookie non contiene wordpress_logged_in
  • Edge Cache TTL: 4 ore
  • Browser Cache TTL: 4 ore

Regola 2 — Bypass per utenti loggati:

  • Match: cookie contiene wordpress_logged_in
  • Cache Status: Bypass

Regola 3 — Bypass per WooCommerce:

  • Match: URL contiene /cart/, /checkout/, /my-account/ OR cookie contiene woocommerce_cart_hash
  • Cache Status: Bypass

Queste tre regole coprono il 95% dei casi. Se il cliente usa BuddyPress, bbPress, o plugin di membership, aggiungi regole di bypass per quelle sezioni specifiche.

Impostazioni Cloudflare raccomandate per WordPress

Impostazione Valore Perché
SSL/TLS mode Full (strict) Forza HTTPS tra Cloudflare e l’origine
Always Use HTTPS On Redirect automatico HTTP → HTTPS
Automatic HTTPS Rewrites On Riscrive link HTTP in HTTPS a livello edge
Rocket Loader Off Rompe script di terze parti e plugin jQuery
Minification (HTML/CSS/JS) On Riduce dimensione file trasferiti
Brotli compression On Compressione migliore di gzip, supportata da tutti i browser moderni
HTTP/3 On Protocollo più veloce con connessioni multiplexed

Rocket Loader è disattivato di default con il plugin WordPress. Tienilo spento. Nella nostra esperienza, rompe più siti di quanti ne ripari. Se vuoi il deferred loading degli script, usa delega il lavoro al plugin di cache che hai già installato.

Performance reale con Cloudflare Free

Abbiamo misurato il TTFB su un sito WordPress su hosting condiviso prima e dopo Cloudflare Free con HTML caching:

Posizione visitatore Senza CDN Con Cloudflare Free Miglioramento
Stessa regione del server 320ms 280ms 12%
Europa (server in US) 780ms 210ms 73%
Asia-Pacifico (server in US) 1.240ms 180ms 85%
Sud America (server in US) 980ms 220ms 78%

Per i visitatori nella stessa regione del server, il miglioramento è modesto (12%). Per i visitatori internazionali, la differenza è drastica. Se il tuo cliente ha un pubblico globale, Cloudflare Free da solo risolve il problema del TTFB per i visitatori lontani.

BunnyCDN per WordPress: Setup e Configurazione

BunnyCDN è un pull zone CDN con un pricing aggressivo: $0.01 per GB servito. Per un’agenzia che gestisce molti siti con traffico variabile, questo modello pay-as-you-go è interessante. Non cambi nameserver, non instradi tutto il traffico attraverso il CDN. BunnyCDN lavora a livello di URL degli asset statici.

Creazione della pull zone

  1. Crea un account su bunny.net
  2. Vai su CDN → Pull Zones e crea una nuova zona
  3. Imposta l’origin URL all’indirizzo del sito WordPress (es. https://miosito.it)
  4. Nota l’URL BunnyCDN assegnato (es. miazona.b-cdn.net)
  5. Opzionale: collega un hostname personalizzato (es. cdn.miosito.it) con un CNAME

BunnyCDN genera automaticamente un certificato SSL Let’s Encrypt per gli hostname personalizzati. Devi solo creare il record CNAME nel DNS puntando cdn.miosito.it a miazona.b-cdn.net.

Integrazione con WordPress

Il modo più semplice per integrare BunnyCDN è tramite un plugin di cache che supporta la riscrittura degli URL. WP Rocket, W3 Total Cache, WP Super Cache e LiteSpeed Cache supportano tutti BunnyCDN nativamente.

Con WP Rocket, la configurazione è tre click:

  1. Vai su WP Rocket → scheda CDN
  2. Abilita CDN e inserisci l’URL BunnyCDN (miazona.b-cdn.net o cdn.miosito.it)
  3. Salva e verifica che gli asset si carichino dal nuovo URL

Se non usi un plugin di cache, il plugin BunnyCDN per WordPress dal repository gestisce la riscrittura degli URL per tutti i file in wp-content/uploads, wp-content/themes e wp-content/plugins.

Configurazione avanzata BunnyCDN

BunnyCDN offre impostazioni che val la pena configurare oltre il default:

  • Cache expiration: 6 ore per asset statici, 1 ora per HTML (se abiliti Perma-Cache)
  • Perma-Cache: Memorizza permanentemente i file sul disco del PoP invece che in RAM. Riduce i costi di bandwidth dell’origine ma aumenta leggermente la latenza per il primo caricamento
  • WebP/Vary support: Abilita la consegna di formati moderni in base all’header Accept del browser
  • Query string sort: Normalizza le query string per evitare cache miss su URL con parametri in ordine diverso

KeyCDN per WordPress: Setup e Configurazione

KeyCDN è un’altra opzione pull zone, con un piano iniziale a $4 e 14 giorni di prova. Ha 25+ PoP e supporta HTTP/2. Rispetto a BunnyCDN, KeyCDN ha una dashboard più tecnica e meno fronzoli. Per sviluppatori che preferiscono CLI e API, è una scelta solida.

Configurazione

  1. Crea un account su keycdn.com
  2. Crea una nuova zone (Pull Zone)
  3. Imposta l’origin URL
  4. Configura un hostname personalizzato (es. cdn.miosito.it) con CNAME
  5. Abilita SSL gratuito (Let’s Encrypt integrato)

Per l’integrazione con WordPress, KeyCDN fornisce un plugin ufficiale che gestisce la riscrittura degli URL e il purge della cache. In alternativa, WP Rocket e W3 Total Cache supportano KeyCDN nativamente.

Quando scegliere KeyCDN

KeyCDN brilla in due scenari: quando hai bisogno di token authentication per proteggere file premium, e quando vuoi controllo granulare sulle regole di cache per zona. Per un’agenzia che gestisce siti con contenuti protetti (membership, e-learning, area riservata clienti), KeyCDN offre features che Cloudflare Free e BunnyCDN base non hanno.

Confronto diretto: Cloudflare vs BunnyCDN vs KeyCDN

Feature Cloudflare Free BunnyCDN KeyCDN
Modello Reverse proxy Pull zone Pull zone
Setup Cambio nameserver Plugin/cache Plugin/cache
Cache HTML Sì (con regole) Sì (Perma-Cache) No
DDoS protection Inclusa Base Base
WAF Pro ($20/mese) No No
SSL Automatico Let’s Encrypt Let’s Encrypt
PoP globali 300+ 120+ 25+
Prezzo Gratis / $20 Pro $0.01/GB $0.04/GB
Purge automatico WP Plugin ufficiale Plugin/cache Plugin ufficiale
Image optimization Pro plan $9.5/mese add-on No
Token authentication Pro plan Sì Sì

Quale scegliere per la tua agenzia

Dipende dal tipo di clienti che gestisci. Ecco la nostra classificazione basata su 50+ siti configurati:

Cloudflare Free per la maggior parte dei siti. Se il cliente non ha WooCommerce o aree riservate complesse, è la scelta più semplice e copre tutto: CDN, SSL, DDoS, minification. Zero costi.

Cloudflare Pro per siti che necessitano di WAF rules personalizzate o image optimization. Il costo fisso di $20/mese è prevedibile e fatturabile al cliente come “performance package”.

BunnyCDN per siti ad alto traffico dove il pricing per GB è più economico di un piano Cloudflare fisso. Un sito con 500GB/mese di traffico CDN costa $5 con BunnyCDN contro $20 di Cloudflare Pro. Il catch: niente WAF integrato.

KeyCDN per siti con contenuti protetti che richiedono token authentication, o quando hai già un WAF separato e vuoi solo un CDN pulito senza funzioni extra.

Configurazione Nginx per supporto CDN

Se il tuo server usa Nginx (e dovrebbe, per le performance WordPress), devi assicurarti che gli header di cache siano corretti per i file statici. Aggiungi questo al tuo server block:

# Cache static assets per 1 anno
location ~* \.(js|css|png|jpe?g|gif|ico|svg|woff2?|ttf|eot)$ {
    expires 365d;
    add_header Cache-Control "public, immutable";
    add_header X-Content-Type-Options nosniff;
    access_log off;
}

# No-cache per pagine dinamiche
location ~ \.php$ {
    add_header Cache-Control "no-cache, no-store, must-revalidate";
    add_header Pragma "no-cache";
}

L’header immutable dice al browser che il file non cambierà mai senza un cambio di URL. Questo elimina i conditional requests (304 If-Modified-Since) che aggiungono latenza inutile. I file WordPress con versioning (style.css?ver=6.2) beneficiano di questo approccio: quando aggiorni il tema, il version number cambia, l’URL cambia, il browser scarica il nuovo file.

CDN e WooCommerce: cosa non cacheare

WooCommerce è il caso più delicato. Memorizzare nella cache la pagina del carrello di un utente e servirla a un altro utente è un disastro. Ecco le regole d’oro:

  • Mai cacheare: /cart/, /checkout/, /my-account/, /order-received/
  • Mai cacheare pagine con cookie WooCommerce: woocommerce_cart_hash, woocommerce_items_in_cart
  • Cacheabile con attenzione: pagine prodotto (con purge al cambio prezzo o stock), pagine shop (con purge al cambio catalogo)
  • Sempre cacheabile: immagini prodotto, CSS, JS, font

Per Cloudflare, la Regola 3 che abbiamo visto prima copre i casi critici. Per BunnyCDN e KeyCDN, il rischio è minore perché non cacheano HTML di default, ma se abiliti Perma-Cache o page caching, assicurati di escludere le URL WooCommerce sensibili.

Automatizzare la configurazione CDN per 50+ siti

Configurare un CDN manualmente su 50 siti non è scalabile. Nella nostra gestione di siti WordPress multi-cliente, abbiamo standardizzato il processo con script automatici.

Per Cloudflare, l’API permette di automatizzare tutto:

#!/bin/bash
# Script: setup-cloudflare.sh
# Configura Cloudflare per un sito WordPress via API

CF_API_TOKEN="your-api-token"
CF_ZONE_ID="zone-id"
WP_DOMAIN="miosito.it"

# Crea cache rule per HTML anonimo
curl -s -X POST \
  "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/rulesets/phases/http_request_cache_settings/entrypoint" \
  -H "Authorization: Bearer ${CF_API_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "rules": [{
      "expression": "(not http.request.uri.path contains \"/wp-admin\") and (not http.request.uri.path contains \"/wp-login\") and (not http.cookie contains \"wordpress_logged_in\")",
      "action": "set_cache_settings",
      "action_parameters": {
        "edge_ttl": {"mode": "override_origin", "value": 14400},
        "browser_ttl": {"mode": "override_origin", "value": 14400}
      }
    }]
  }'

echo "Cache rule creata per ${WP_DOMAIN}"

Per BunnyCDN, la creazione di pull zone via API è altrettanto diretta:

#!/bin/bash
# Script: setup-bunnycdn.sh
# Crea una pull zone BunnyCDN per un sito WordPress

BUNNY_API_KEY="your-api-key"
WP_DOMAIN="miosito.it"

curl -s -X POST \
  "https://api.bunny.net/pullzone" \
  -H "AccessKey: ${BUNNY_API_KEY}" \
  -H "Content-Type: application/json" \
  -d "{
    \"OriginUrl\": \"https://${WP_DOMAIN}\",
    \"Name\": \"${WP_DOMAIN}-cdn\",
    \"EnableLogging\": true,
    \"EnableCacheControl\": true,
    \"CacheExpiration\": 21600
  }"

echo "Pull zone creata per ${WP_DOMAIN}"

Con questi script, puoi configurare un nuovo cliente in 30 secondi invece di 15 minuti di click manuali. Per 50 siti, sono 12 ore di lavoro risparmiate. Non male.

Monitoraggio CDN: cosa misurare e come

Dopo aver configurato il CDN, devi verificare che stia effettivamente funzionando. Tre metriche da tenere d’occhio:

1. Cache Hit Ratio

La percentuale di richieste servite dal CDN rispetto a quelle che raggiungono il server di origine. Un ratio sano è sopra il 90%. Sotto l’80%, qualcosa non funziona: regole di cache troppo conservative, purge troppo frequenti, o URL con query string che bypsssano la cache.

Cloudflare mostra il cache ratio in Analytics → Performance. BunnyCDN lo mostra nel dashboard della pull zone. Se il ratio è basso, controlla i log per vedere quali URL non vengono cacheati.

2. TTFB globale

Misura il TTFB da diverse posizioni geografiche con WebPageTest o GTmetrix. Confronta i valori prima e dopo la configurazione del CDN. Se non vedi un miglioramento per i visitatori lontani, il CDN non sta servendo i file.

3. Error rate

Cloudflare Analytics mostra gli errori 5xx per zona. BunnyCDN mostra gli errori di origin pull nel dashboard. Un picco di errori dopo una configurazione indica di solito un problema di SSL tra CDN e origine (controlla che l’origine abbia un certificato valido e che il SSL mode sia “Full strict” su Cloudflare).

CDN e Core Web Vitals: l’impatto reale

I Core Web Vitals sono le metriche che Google usa per valutare la performance dei siti. Un CDN influisce su tutte e tre le metriche, ma in modo diverso:

Metrica Impatto CDN Come massimizzare
LCP (Largest Contentful Paint) Alto: riduce il tempo di download dell’immagine più grande Abilita image optimization + cache lunga per immagini
INP (Interaction to Next Paint) Medio: riduce il carico del main thread se i file JS sono più piccoli e compressi Minification + Brotli compression
CLS (Cumulative Layout Shift) Basso: il CDN non influisce direttamente sul layout shift Serva immagini con dimensioni esplicite (width/height)

Il LCP è dove il CDN fa la differenza più grande. Se l’immagine LCP di un sito è 400KB e il visitatore è a 200ms di latenza dal server, il download richiede ~800ms. Con un CDN a 20ms di latenza, scende a ~120ms. Risparmio netto: 680ms sul LCP, che da solo può spostare un sito da “Needs Improvement” a “Good” nei Core Web Vitals.

Errori comuni nella configurazione CDN per WordPress

1. Dimenticare il purge cache alla pubblicazione

Senza purge automatico, i visitatori vedono contenuti vecchi per ore. Il plugin Cloudflare per WordPress lo fa automaticamente. Per BunnyCDN, configura il webhook di purge nel plugin di cache. Per KeyCDN, il plugin ufficiale gestisce il purge.

2. Cacheare pagine con cookie di sessione

Se un utente si logga, naviga, e poi un altro utente vede la sua pagina “My Account” cached… non è un buon giorno. Le regole di bypass per wordpress_logged_in sono obbligatorie.

3. Non abilitare Brotli

Brotli comprime il 15-20% meglio di gzip per file testuali (HTML, CSS, JS). Cloudflare lo ha integrato e gratuito. Non c’è motivo per non attivarlo. BunnyCDN supporta Brotli nelle impostazioni della pull zone.

4. Lasciare Rocket Loader attivo

Rocket Loader di Cloudflare promette il deferred loading degli script. Nella realtà, rompe plugin jQuery, broken checkout WooCommerce, broken slider, broken form. Tienilo spento. Usa il deferred loading del tuo plugin di cache WordPress.

5. SSL mode “Flexible” invece di “Full (strict)”

Flexible crea un loop di redirect HTTP→HTTPS oppure serve contenuti misti. Full (strict) richiede un certificato SSL valido sull’origine, ma è l’unica configurazione sicura. Se l’origine non ha SSL, installalo prima di abilitare Cloudflare.

FAQ: CDN WordPress per Agenzie

Un CDN gratuito è sufficiente per un sito WordPress aziendale?

Sì, nella maggior parte dei casi. Cloudflare Free copre CDN, SSL, DDoS protection e minification. Per un sito aziendale con traffico moderato e un pubblico prevalentemente locale, è più che sufficiente. Il piano Pro ha senso quando hai bisogno di WAF rules personalizzate o image optimization automatica.

Quanto costa un CDN per 50 siti WordPress?

Con Cloudflare Free: zero. Con Cloudflare Pro: $20/mese per sito, quindi $1.000/mese per 50 siti. Con BunnyCDN a $0.01/GB: dipende dal traffico. Se ogni sito genera 20GB/mese di traffico CDN, sono $10/sito/mese, $500 totali. In genere, BunnyCDN è più economico per siti con traffico medio-basso, Cloudflare Pro è meglio per siti che necessitano di WAF.

Posso usare due CDN contemporaneamente?

Technicamente sì, ma non lo consigliamo. Cloudflare in front + BunnyCDN per gli asset statici è una configurazione che alcuni fanno, ma aggiunge complessità senza un beneficio reale. Scegline uno e configuralo bene.

Il CDN sostituisce un plugin di cache WordPress?

No. Il CDN memorizza nella cache i file statici (e l’HTML se configurato) ai margini della rete. Il plugin di cache WordPress genera pagine HTML statiche sul server. I due lavorano a livelli diversi e sono complementari. Usa entrambi: il plugin genera la pagina cached, il CDN la serve al visitatore più velocemente.

Come verifico che il CDN sta funzionando?

Apri il tuo sito in una finestra anonima, apri DevTools → Network, e clicca su un’immagine. Se l’URL dell’immagine punta al dominio del CDN (es. cdn.miosito.it o miazona.b-cdn.net), il CDN sta servendo i file. Per Cloudflare, controlla l’header cf-cache-status: se dice “HIT”, la risposta è servita dalla cache edge.

Gestisci i siti WordPress dei tuoi clienti?

AgencyPilot ti dà report AI, uptime monitoring, backup e portale clienti in un’unica dashboard. Gratis per 3 siti.

Prova gratis
Leggi anche
Tutti gli articoli
Tutti gli articoli