Un TTFB sopra 600ms su WordPress è quasi sempre un problema di stack server, non di codice. Plugin di cache, CDN e ottimizzazioni frontend non servono a nulla se il server impiega un secondo solo per rispondere. Questo articolo spiega come portare il TTFB sotto i 100ms partendo dalla configurazione server.

Perché il TTFB è la metrica che conta davvero

Il TTFB — Time To First Byte — misura il tempo tra la richiesta HTTP e il primo byte di risposta dal server. È la base su cui si costruisce tutto il resto: FCP, LCP, Speed Index dipendono tutti da quando il server inizia a rispondere.

Google considera buono un TTFB sotto 800ms, ottimo sotto 200ms. Sui siti che gestisco direttamente su VPS Hetzner con Nginx ottengo TTFB tra 20ms e 62ms. La differenza rispetto a un hosting condiviso medio è 10-50x.

Il problema dell'hosting condiviso

La maggior parte dei siti WordPress italiani gira su hosting condiviso: Aruba, SiteGround, Hostinger. Il TTFB tipico su questi servizi è tra 400ms e 2s, dipende dal carico del server condiviso in quel momento. Non è un problema risolvibile con plugin — è strutturale.

La soluzione è un VPS dedicato con stack configurato correttamente. Il costo di un VPS Hetzner da 4 vCPU e 8GB RAM è circa 15-20€/mese — meno di molti piani hosting condivisi "premium".

Stack consigliato: Nginx + PHP-FPM + OPcache

La combinazione che uso su tutti i siti che gestisco è Nginx come web server, PHP-FPM per eseguire PHP e OPcache per tenere il bytecode PHP compilato in memoria. Ecco le configurazioni chiave.

OPcache — la differenza più grande

OPcache è spesso disabilitato o configurato con valori di default troppo conservativi. Con questi valori in php.ini il guadagno è immediato:

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.save_comments=1
opcache.enable_cli=0

Con OPcache configurato correttamente il TTFB su una pagina WordPress non in cache scende da 800-1200ms a 150-300ms. È il singolo intervento con il miglior rapporto effort/risultato.

Nginx FastCGI cache — TTFB sotto 20ms

Per le pagine statiche (homepage, archivi, post) la FastCGI cache di Nginx serve HTML precompilato senza passare da PHP. Il TTFB scende a 10-50ms. La configurazione base:

fastcgi_cache_path /tmp/nginx-cache levels=1:2
  keys_zone=WORDPRESS:100m
  inactive=60m
  max_size=1g;

fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header updating
  http_500 http_503;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

La cache va bypassata per utenti loggati, carrello WooCommerce e pagine di checkout. Un map Nginx gestisce questi casi:

map $http_cookie $skip_cache {
  default 0;
  "~*wordpress_logged_in" 1;
  "~*woocommerce_items_in_cart" 1;
}

PHP-FPM pool ottimizzato

Il pool PHP-FPM di default usa dynamic con valori bassi. Per un sito con traffico medio:

pm = ondemand
pm.max_children = 20
pm.process_idle_timeout = 10s
pm.max_requests = 500

ondemand invece di dynamic riduce il consumo di RAM quando il sito è a riposo, mantenendo la capacità di scalare sotto carico.

Redis object cache

Per siti con query MySQL complesse o WooCommerce con molti prodotti, Redis come object cache riduce le query al database. Con il plugin Redis Object Cache e Redis installato sul server, le query ripetute vengono servite dalla RAM invece che dal disco:

# wp-config.php
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_CACHE', true);

Risultati misurabili

Su emporiomotori.it — marketplace auto usate con Laravel + WooCommerce e migliaia di prodotti — il TTFB misurato da server a server è 20ms. Su vaschelavaggio.com — WooCommerce con feed Google Merchant — 62ms. Su edstudio.dev — sito HTML statico — 36ms.

Questi numeri non sono ottenibili su hosting condiviso indipendentemente da quanti plugin di cache installi.

Da dove partire

Se il tuo WordPress ha TTFB sopra 500ms, il primo passo è misurarlo correttamente con curl -s -o /dev/null -w "%{time_starttransfer}" https://tuosito.it/ da un server esterno. Se il risultato è costantemente sopra 500ms, il problema è il server — non i plugin.

Il secondo passo è verificare se OPcache è attivo e configurato. Nella maggior parte dei casi questo da solo dimezza il TTFB senza toccare nient'altro.

Il tuo WordPress è lento sul server?

Mandami l'URL: misuro il TTFB reale, identifico il collo di bottiglia e ti dico cosa si può fare. Analisi gratuita, risposta entro 24 ore.

Analisi gratuita →