Come velocizzare Drupal con le cache giuste: OPcache, APCu e un backend condiviso (Redis o Memcached)
Se il tuo sito Drupal sembra lento, la cache è solitamente la soluzione. Non una soluzione unica, però. Diversi livelli risolvono problemi diversi. Ecco perché OPcache, APCu e un backend condiviso come Redis o Memcached compaiono spesso insieme. Ognuno accelera una parte specifica dello stack. Usali bene e Drupal diventa scattante. Usali male e continua a trascinarsi.
Attenzione: scegli un solo backend condiviso per i bin della cache di Drupal. Usa Redis o Memcached, non entrambi per gli stessi bin.
A colpo d'occhio: da fare subito vs avanzato
- Da fare subito: Abilita OPcache in PHP. Attiva APCu per le cache locali. Scegli un backend condiviso per i bin nelle configurazioni multi-server.
- Avanzato: Mappa bin specifici, ottimizza i timeout del client Redis, regola la dimensione degli elementi di Memcached, comprimi i valori Redis di grandi dimensioni, dimensiona i pool in base all'utilizzo effettivo.
Guida rapida alle decisioni
Configurazione | Da fare subito | Backend condiviso | Ideale per | Note |
---|---|---|---|---|
Server singolo | OPcache + APCu | Opzionale | Siti piccoli su un nodo | La cache del DB potrebbe andare bene. Aggiungi Redis o Memcached se il traffico aumenta. |
Server multipli | OPcache + APCu | Redis o Memcached | Cluster con bilanciamento del carico | Usa un backend condiviso per render, dynamic page cache, page, default, data. |
Contenuti ad alta variabilità | OPcache | Redis | Tagging e invalidazione complessi | Le strutture e le opzioni di persistenza aiutano. |
Snello e semplice | OPcache | Memcached | Caching pura con overhead minimo | Molto veloce, effimero per progettazione. |
Cosa fa ogni cache
- OPcache: Accelera PHP stesso memorizzando nella cache gli script compilati.
- APCu: Cache locale per server, chiave-valore, per piccole ricerche.
- Redis: Archivio dati condiviso in memoria per cache, code, lock, sessioni.
- Memcached: Cache chiave-valore condivisa in memoria, molto semplice e veloce.
Come si integrano in Drupal
- OPcache: Abilita a livello PHP. Non è un modulo Drupal.
- APCu: Serve cache locali e dati di bootstrap.
- Redis o Memcached: Mappa render, dynamic page cache, page, default, data al backend condiviso. Supporta anche sessioni, lock e code.
Correlato: Cache di stato (Drupal 10.3+, attiva per impostazione predefinita in Drupal 11). Vedi il post separato per i dettagli: Accelera il backend di Drupal con $settings['state_cache']
.
Suggerimento Pro: Nelle configurazioni multi-server, mantieni bootstrap in APCu per una latenza ultra-bassa e sposta il resto nel backend condiviso.
Ricette rapide per settings.php
Copia e incolla, poi adatta.
Redis
Integrazione Drupal
$settings['container_yamls'][] = 'modules/contrib/redis/redis.services.yml';
$settings['redis.connection']['interface'] = 'PhpRedis';
$settings['redis.connection']['host'] = '127.0.0.1';
$settings['redis.connection']['port'] = 6379;
$settings['cache']['default'] = 'cache.backend.redis';
$settings['cache']['bins']['render'] = 'cache.backend.redis';
$settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.redis';
$settings['cache']['bins']['page'] = 'cache.backend.redis';
Ottimizzazione delle prestazioni
// Compressione opzionale
$settings['redis_compress_length'] = 100;
$settings['redis_compress_level'] = 1;
// Timeout client (PhpRedis)
$settings['redis.connection']['timeout'] = 1.0;
$settings['redis.connection']['read_timeout'] = 1.0;
$settings['redis.connection']['retry_interval'] = 100;
$settings['redis.connection']['persistent'] = TRUE;
- container_yamls: Registra i servizi Redis.
- interface: Sceglie il client. PhpRedis è un'estensione nativa.
- host/port: Specifica il target di connessione. Preferisci un socket Unix sullo stesso host.
- cache.default: Imposta il backend predefinito per i bin non mappati.
- bins: Mappa bin specifici a Redis.
- compress_length/level: Comprime i valori di grandi dimensioni per risparmiare memoria.
- timeouts/persistent: Imposta i timeout di connessione/lettura e riutilizza le connessioni.
Memcached
Integrazione Drupal
$settings['container_yamls'][] = 'modules/contrib/memcache/memcache.services.yml';
$settings['memcache']['servers']['127.0.0.1:11211'] = 'default';
$settings['memcache']['bins']['render'] = 'default';
$settings['memcache']['bins']['dynamic_page_cache'] = 'default';
$settings['memcache']['bins']['page'] = 'default';
$settings['cache']['default'] = 'cache.backend.memcache';
- container_yamls: Registra i servizi Memcache.
- servers: Definisce l'elenco dei server e il nome del pool.
- bins: Mappa i bin a un pool.
- cache.default: Imposta il backend predefinito per i bin non mappati.
APCu per i bin locali
// Richiede il modulo backend APCu
$settings['cache']['bins']['bootstrap'] = 'cache.backend.apcu';
- bootstrap: Mantiene i dati di bootstrap attivi nel processo per una latenza minima.
Impostazioni di runtime/server (fuori da settings.php)
Impostazioni PHP (php.ini)
OPcache
opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=192
opcache.max_accelerated_files=16229
opcache.validate_timestamps=0
opcache.revalidate_freq=0
opcache.interned_strings_buffer=16
opcache.fast_shutdown=1
opcache.enable
: Attiva OPcache per FPM o Apache.opcache.enable_cli
: Mantiene OPcache disattivato per la CLI.opcache.memory_consumption
: Alloca un pool di memoria per gli script compilati.opcache.max_accelerated_files
: Imposta la dimensione della tabella hash.opcache.validate_timestamps
: Controlla i timestamp dei file per le modifiche. Imposta a 0 per deploy build-once.opcache.revalidate_freq
: Imposta i secondi tra i controlli dei timestamp quandovalidate_timestamps
= 1.opcache.interned_strings_buffer
: Alloca memoria per le stringhe condivise.opcache.fast_shutdown
: Abilita uno spegnimento più rapido della richiesta.
APCu
apc.enabled=1
apc.enable_cli=0
apc.shm_size=128M
apc.ttl=0
apc.gc_ttl=3600
apc.enabled
: Attiva APCu per FPM.apc.enable_cli
: Mantiene APCu disattivato per la CLI.apc.shm_size
: Imposta la memoria condivisa totale.apc.ttl
: Imposta il TTL predefinito per le voci.apc.gc_ttl
: Imposta il tempo per mantenere le voci orfane.
Server Redis (redis.conf)
maxmemory 2gb
maxmemory-policy allkeys-lru
timeout 1
tcp-keepalive 60
maxmemory
: Imposta il limite di memoria.maxmemory-policy
: Imposta il comportamento di espulsione quando è pieno.timeout
: Imposta il timeout del client inattivo in secondi.tcp-keepalive
: Imposta l'intervallo per i probe di keepalive.
Server Memcached (flag)
memcached -m 2048 -I 4m -f 1.25 -o slab_reassign,slab_automove
-m
: Imposta la memoria totale in MB.-I
: Imposta la dimensione massima dell'elemento.-f
: Imposta il fattore di crescita per le classi di slab.-o slab_reassign,slab_automove
: Abilita il ribilanciamento degli slab.
Regole rapide di dimensionamento
Cache | Impostazione chiave | Regola rapida (MB) |
---|---|---|
OPcache | opcache.memory_consumption | MB = (codebase_MB × 3) + 32 |
OPcache | opcache.max_accelerated_files | ≈ 1.5 × file PHP (usa 10000, 16229, 32531) |
APCu | apc.shm_size | MB ≈ (chiavi × (byte_elemento_medio + 100) × 1.2) ÷ 1.000.000 |
Redis | maxmemory | MB ≈ (elementi × (byte_elemento_medio + 50) × 1.3) ÷ 1.000.000 |
Memcached | -m | MB ≈ (elementi × byte_elemento_medio × 1.3) ÷ 1.000.000 |
Memcached | -I | Inizia da 4 MB; aumenta se necessario |
Miti comuni
- Mito: OPcache memorizza nella cache l'HTML — Verità: Memorizza nella cache il codice PHP compilato.
- Mito: APCu funziona tra server — Verità: È locale a un processo server.
- Mito: Redis è sempre migliore di Memcached — Verità: Scegli in base alle esigenze.
- Mito: Le cache miss indicano che qualcosa non va — Verità: I miss accadono e si scaldano con il traffico.
Checklist rapida di configurazione
- OPcache:
- Abilita l'estensione in PHP.
- Ottimizza la dimensione della memoria e le impostazioni di rivalutazione per la produzione.
- Assicurati che
opcache.memory_consumption
sia sufficiente per contenere il tuo codebase.
- APCu:
- Installa l'estensione PHP.
- Conferma le impostazioni CLI e FPM se esegui entrambi.
- Dimensiona
apc.shm_size
con margine per evitare espulsioni.
- Redis:
- Installa il server e l'estensione PHP.
- Aggiungi il modulo Redis di Drupal e mappa i bin della cache corretti.
- Imposta i timeout del client e considera sessioni, lock e code.
- Memcached:
- Installa il server e l'estensione PHP.
- Aggiungi il modulo Memcache di Drupal e mappa i bin desiderati.
- Imposta
-I
per la dimensione massima dell'elemento; assicurati che l'app tolleri la perdita della cache.
Evita queste insidie
- Evita di mescolare Redis e Memcached per lo stesso bin.
- Evita di sottodimensionare le cache. Monitora le espulsioni e il tasso di successo.
- Evita l'eccesso di caching. Concentrati sui dati costosi e riutilizzabili.
- Evita di rompere l'invalidazione. Rispetta i tag e i contesti della cache.
Come misurare il successo
- Tendenze del tempo di risposta: Il tempo per il primo byte dovrebbe diminuire dopo il riscaldamento.
- Carico del database: Meno query per richiesta e minore CPU sul database.
- Rapporto di successo (hit ratio): Tieni traccia dei tassi di successo della cache. Se i tassi di successo rimangono bassi, rivedi la mappatura dei bin e i TTL.
- Log degli errori: Monitora gli errori di connessione o i timeout da Redis o Memcached.
Considerazioni finali
Inizia con OPcache, aggiungi APCu, poi Redis o Memcached per i bin condivisi. Mantieni la semplicità, misura i risultati e ottimizza.