Velocizzare WordPress Senza Plugin: 15 Ottimizzazioni che Nessun Plugin Può Fare
I plugin di cache e performance risolvono il 60% dei problemi di velocità WordPress. Il restante 40% è server-side: configurazione Nginx, PHP-FPM, MySQL, e sistema operativo. Roba che nessun plugin può toccare.
Queste 15 ottimizzazioni richiedono accesso SSH al server. Se sei su hosting condiviso, la maggior parte non è applicabile (motivo in più per passare a un VPS).
PHP: Le Ottimizzazioni che Contano
1. PHP 8.3 (non 8.1, non 7.4)
Ogni major version di PHP porta miglioramenti di performance del 10-20%. PHP 8.3 è più veloce del 15-20% rispetto a 8.1 su WordPress. Gratis. Solo aggiornando.
# Verifica versione
php -v
# Su Debian/Ubuntu, installa PHP 8.3
sudo apt install php8.3-fpm php8.3-mysql php8.3-xml php8.3-mbstring php8.3-curl php8.3-zip php8.3-gd php8.3-intl
2. OPcache configurato correttamente
OPcache memorizza il bytecode PHP compilato. WordPress compila migliaia di file PHP per ogni pagina. Senza OPcache, li ricompila ogni volta.
; php.ini
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.jit_buffer_size=128M
opcache.jit=1255
L’opzione opcache.jit=1255 abilita il JIT compiler di PHP 8.x. Impatto: +5-15% su WordPress.
3. PHP-FPM pool ottimizzato
; /etc/php/8.3/fpm/pool.d/wordpress.conf
[wordpress]
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
pm.max_requests = 500
request_terminate_timeout = 30s
pm.max_children dipende dalla RAM: regola pratica è RAM (MB) / 40 = max_children. Server con 2GB → 50 workers max. Con 1GB → 25.
Nginx: Configurazione Performance
4. FastCGI Cache (la più impattante)
FastCGI cache serve le pagine dalla memoria di Nginx senza mai toccare PHP. TTFB da 300-800ms a 10-30ms.
# nginx.conf - definisci la cache zone
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=WORDPRESS:100m inactive=60m max_size=1g;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
# Nel server block
set $skip_cache 0;
# Non cachare per utenti loggati
if ($http_cookie ~* "wordpress_logged_in") { set $skip_cache 1; }
# Non cachare POST requests
if ($request_method = POST) { set $skip_cache 1; }
# Non cachare WooCommerce cart/checkout
if ($request_uri ~* "/cart|/checkout|/my-account") { set $skip_cache 1; }
location ~ \.php$ {
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 60m;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header X-FastCGI-Cache $upstream_cache_status;
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
5. Gzip/Brotli Compression
# Brotli (migliore, se disponibile)
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript;
# Gzip (fallback)
gzip on;
gzip_comp_level 5;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript image/svg+xml;
6. Static file caching
location ~* \.(jpg|jpeg|png|gif|ico|css|js|webp|avif|woff2|svg)$ {
expires 365d;
add_header Cache-Control "public, immutable";
access_log off;
}
7. HTTP/2 (o HTTP/3)
listen 443 ssl http2;
# Per HTTP/3 (se il tuo Nginx lo supporta):
# listen 443 quic reuseport;
# add_header Alt-Svc 'h3=":443"; ma=86400';
MySQL: Query Che Non Devono Essere Lente
8. Configurazione InnoDB
# /etc/mysql/mysql.conf.d/performance.cnf
[mysqld]
innodb_buffer_pool_size = 512M # 50-70% della RAM disponibile
innodb_log_file_size = 256M
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 2 # Più veloce, rischio minimo
query_cache_type = 0 # Disabilitato in MySQL 8+ (usa Redis)
max_connections = 100
9. Redis Object Cache
# Installa Redis
sudo apt install redis-server
# Plugin WordPress
wp plugin install redis-cache --activate
wp redis enable
Redis memorizza gli oggetti WordPress in RAM. Riduce le query MySQL del 50-80% su pagine complesse (dashboard, WooCommerce, BuddyPress).
10. Pulizia database periodica
# Rimuovi revisioni vecchie (tieni le ultime 5 per post)
wp post delete $(wp post list --post_type=revision --format=ids --posts_per_page=1000) --force
# Rimuovi transient scaduti
wp transient delete --expired
# Ottimizza le tabelle
wp db optimize
Sistema Operativo
11. Swap file (se poca RAM)
# Crea 2GB di swap
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
12. Kernel tuning per web server
# /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_tw_buckets = 1440000
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 300
CDN e Edge
13. Cloudflare (free tier)
CDN globale, cache automatica degli asset statici, DNS velocissimo. Il free tier è sufficiente per la maggior parte dei siti. Setup: 10 minuti (cambio nameserver).
14. Image CDN
Servizi come Cloudflare Images, imgix, o BunnyCDN ottimizzano e servono le immagini dal edge server più vicino all’utente. Trasformazione on-the-fly (WebP, resize, crop).
15. Preconnect alle risorse esterne
<!-- Nel <head> -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="dns-prefetch" href="https://www.google-analytics.com">
L’Impatto Misurato
| Ottimizzazione | Impatto TTFB | Difficoltà | Tempo |
|---|---|---|---|
| FastCGI Cache | -80% (da 300ms a 30ms) | Media | 30 min |
| PHP 8.3 + OPcache | -20% | Bassa | 20 min |
| Redis Object Cache | -30% su pagine uncached | Bassa | 10 min |
| Brotli compression | -25% transfer size | Bassa | 5 min |
| MySQL tuning | -15% query time | Media | 15 min |
| HTTP/2 | Multiplexing (meno connessioni) | Bassa | 2 min |
FAQ
Posso fare queste ottimizzazioni su hosting condiviso?
No. Le ottimizzazioni server-side richiedono accesso SSH e permessi root. Su hosting condiviso puoi solo: scegliere la versione PHP (dal pannello), abilitare la cache del provider (se disponibile), e usare un CDN esterno. Per controllo completo, serve un VPS (da $5/mese su Hetzner o DigitalOcean).
FastCGI cache o plugin di cache WordPress?
FastCGI cache è più veloce (serve dalla RAM di Nginx, PHP non parte). Ma non gestisce purge automatico quando aggiorni un post. La combinazione ideale: FastCGI cache + Nginx Helper plugin (che fa purge automatico su publish/edit).
Redis è meglio di Memcached per WordPress?
Sì. Redis supporta persistenza (sopravvive ai restart), data types più ricchi, e il plugin Redis Object Cache per WordPress è ben mantenuto. Memcached è più veloce in teoria ma le differenze sono trascurabili per WordPress.