Skip to content

Memcached è un sistema di caching distribuito in-memory, open source, progettato per ridurre il carico sui database e accelerare le applicazioni web dinamiche. Sviluppato nel 2003 da Danga Interactive per LiveJournal, oggi è utilizzato da aziende come Facebook, Wikipedia e Netflix. La versione stabile attuale è la 1.6.x.

Questa guida copre installazione, configurazione, sicurezza e tuning di Memcached su sistemi Linux con PHP 8.x — il setup che utilizzo sui server che gestisco per siti WordPress ad alto traffico.

Cos’è Memcached e a cosa serve

Memcached è un key-value store in RAM. Memorizza blocchi di dati arbitrari — risultati di query SQL, risposte API, frammenti di pagine renderizzate — riducendo le chiamate ripetitive al database. Il funzionamento è semplice: l’applicazione chiede a Memcached il dato associato a una chiave; se presente (cache hit), lo restituisce in microsecondi dalla RAM; se assente (cache miss), l’applicazione interroga il database, ottiene il risultato e lo salva in Memcached per le richieste successive.

La differenza rispetto ad OPcache è sostanziale: OPcache accelera l’esecuzione del codice PHP compilando e memorizzando il bytecode degli script, Memcached accelera l’accesso ai dati cachando i risultati delle operazioni più costose. Sono complementari e vanno usati entrambi.

Su un sito WordPress con molti contenuti, le query al database MySQL rappresentano il collo di bottiglia principale. Ogni pageview può generare decine di query per caricare opzioni, menu, widget, post e metadati. Memcached elimina la maggior parte di queste query ripetitive, abbattendo i tempi di risposta del server (TTFB) e aumentando la capacità di gestire traffico concorrente.

Memcached vs Redis: quale scegliere

La domanda più frequente è: Memcached o Redis? Entrambi sono datastore in-memory, ma hanno architetture e casi d’uso diversi.

CaratteristicaMemcachedRedis
Strutture datiSolo stringhe (key-value)Stringhe, liste, set, hash, sorted set, stream
PersistenzaNo (solo RAM)Opzionale (RDB, AOF)
Multi-threadingNativo (multi-threaded)Single-threaded (I/O threads da Redis 6)
MemoriaSlab allocator efficienteOverhead maggiore per strutture complesse
Scalabilità orizzontaleNativa (consistent hashing client-side)Redis Cluster (più complesso)
Pub/Sub, Lua scriptingNo
Caso d’uso idealeCache pura, sessioni sempliciCache + broker messaggi, code, leaderboard

Regola pratica: se serve solo cache degli oggetti (il caso tipico di WordPress, Joomla!, Prestashop, Magento), Memcached è più leggero e il multi-threading nativo lo rende più performante su server multi-core. Se servono strutture dati complesse, persistenza o pub/sub, Redis è la scelta corretta.

Installare Memcached su Ubuntu/Debian

I comandi seguenti sono testati su Ubuntu 22.04 LTS e 24.04 LTS con PHP 8.x e Nginx. Accedi al server via SSH con un utente non-root con privilegi sudo.

Aggiorna i repository e installa Memcached:

sudo apt update
sudo apt install memcached libmemcached-tools

Il pacchetto libmemcached-tools include utility come memcstat, memccat e memcflush utili per diagnostica e manutenzione.

Installa l’estensione PHP per Memcached. Esistono due estensioni: php-memcache (vecchia, meno funzionalità) e php-memcached (basata su libmemcached, supporta consistent hashing e binary protocol). Usa la seconda:

sudo apt install php-memcached

Riavvia PHP-FPM e Nginx per caricare il modulo:

sudo systemctl restart php8.3-fpm
sudo systemctl reload nginx

Nota: sostituisci php8.3-fpm con la versione PHP installata sul tuo server (es. php8.1-fpm, php8.2-fpm).

Abilita Memcached all’avvio del sistema:

sudo systemctl enable memcached

Configurare Memcached per la produzione

Il file di configurazione principale è /etc/memcached.conf. I parametri più importanti da verificare e adattare al tuo scenario:

# Memoria massima allocata (MB) — default 64
-m 256

# Porta TCP — default 11211
-p 11211

# Binding — SOLO localhost per sicurezza
-l 127.0.0.1

# Disabilita UDP (mitigazione attacchi DDoS amplification)
-U 0

# Connessioni simultanee massime — default 1024
-c 2048

# Thread worker — default 4, non superare il numero di core
-t 4

# Dimensione massima di un singolo item — default 1MB
-I 2m

# Esegui come utente memcache (non root)
-u memcache

Dopo ogni modifica, riavvia il servizio:

sudo systemctl restart memcached

Dimensionare la memoria (-m)

Il valore di -m dipende dal volume di dati da cachare. Per un singolo sito WordPress con 500-1000 post, 128-256 MB sono sufficienti. Per un e-commerce con migliaia di prodotti e varianti, valuta 512 MB o più. Memcached usa uno slab allocator per gestire la memoria: alloca blocchi di dimensioni crescenti (slab class) per evitare frammentazione. Il growth factor di default è 1.25x — nella maggior parte dei casi non serve modificarlo.

Tieni presente che Memcached alloca la memoria all’avvio e non la rilascia al sistema operativo. Se imposti -m 512, quei 512 MB saranno riservati permanentemente. Verifica che il server abbia RAM sufficiente per il sistema operativo, il web server, PHP-FPM, MySQL e Memcached insieme.

Thread worker (-t)

Memcached è multi-threaded e gestisce le connessioni distribuite fra i thread worker. Il default di 4 thread è adeguato per la maggior parte dei casi. Aumentare oltre il numero di core disponibili è controproducente — la documentazione ufficiale avverte che valori superiori a 80 rallentano significativamente le prestazioni.

Sicurezza: binding, SASL e TLS

Memcached non ha meccanismi di autenticazione integrati nel protocollo base. Chiunque riesca a connettersi alla porta 11211 può leggere, scrivere e cancellare tutti i dati in cache. La sicurezza va implementata a livello di rete e configurazione.

Binding a localhost

La prima linea di difesa è il parametro -l 127.0.0.1, che limita le connessioni alla sola interfaccia locale. Verifica che sia impostato correttamente — è il default sulle distribuzioni recenti, ma vale la pena controllare. Disabilita sempre il protocollo UDP con -U 0: nel 2018 sono stati documentati attacchi DDoS amplification massivi che sfruttavano Memcached esposto su UDP.

Unix socket

Se Memcached e l’applicazione girano sullo stesso server (il caso più comune), puoi usare un Unix socket al posto di TCP. Elimina completamente l’esposizione di rete ed è marginalmente più veloce:

# In /etc/memcached.conf — commenta -p e -l, aggiungi:
-s /var/run/memcached/memcached.sock
-a 0660

SASL authentication

Per ambienti dove più applicazioni condividono lo stesso server Memcached, abilita l’autenticazione SASL. Richiede la compilazione con supporto SASL (presente nei pacchetti delle distribuzioni recenti). Configura username e password in /etc/sasl2/memcached.conf e avvia Memcached con il flag -S.

TLS (dalla versione 1.5.13+)

Dalla versione 1.5.13 Memcached supporta TLS per cifrare il traffico client-server. È rilevante in architetture distribuite dove i dati transitano sulla rete. Per un singolo server con binding su localhost, TLS è superfluo. Consulta la documentazione ufficiale per i dettagli sulla configurazione dei certificati.

Firewall

Anche con il binding su localhost, aggiungi una regola firewall come ulteriore protezione:

sudo ufw deny 11211

Verificare il funzionamento

Tre metodi per verificare che Memcached sia attivo e funzionante.

1. Verifica del servizio e della porta

# Stato del servizio
sudo systemctl status memcached

# Verifica che ascolti su 127.0.0.1:11211 (solo TCP, no UDP)
sudo ss -tlnp | grep memcached

2. Verifica del modulo PHP

Controlla che l’estensione sia caricata da PHP:

php -m | grep memcached

Se il comando restituisce memcached, il modulo è attivo. In alternativa, crea un file phpinfo.php temporaneo nella root del sito, aprilo nel browser e cerca la sezione Memcached. Ricorda di eliminare il file subito dopo la verifica — un phpinfo esposto è un rischio di sicurezza.

3. Test funzionale con PHP

Questo script verifica la connessione e le operazioni di lettura/scrittura:

<?php
$mc = new Memcached();
$mc->addServer('127.0.0.1', 11211);

// Scrivi un valore
$mc->set('test_key', 'Memcached funziona', 60);

// Leggi il valore
$value = $mc->get('test_key');

if ($value) {
    echo "OK: " . $value;
} else {
    echo "ERRORE: impossibile leggere dalla cache";
    echo " — Result code: " . $mc->getResultCode();
}

Se restituisce “OK: Memcached funziona”, il sistema è operativo. Elimina lo script dopo il test.

Monitorare Memcached

Monitorare Memcached è essenziale per capire se la cache è dimensionata correttamente e se sta effettivamente servendo il suo scopo.

Statistiche via telnet

# Statistiche generali
echo "stats" | nc localhost 11211

# Statistiche slab allocator
echo "stats slabs" | nc localhost 11211

# Statistiche items per slab class
echo "stats items" | nc localhost 11211

Metriche chiave da monitorare

Le metriche più importanti nell’output di stats:

  • get_hits / get_misses — il rapporto hit/miss indica l’efficacia della cache. Un hit ratio sotto il 90% suggerisce problemi di dimensionamento o di TTL troppo bassi
  • evictions — numero di item rimossi dalla cache per fare spazio a nuovi dati. Eviction frequenti indicano che la memoria allocata (-m) è insufficiente
  • curr_connections — connessioni attive. Se si avvicina al limite -c, aumenta il valore
  • listen_disabled_num — numero di volte che Memcached ha rifiutato connessioni perché il limite è stato raggiunto. Deve essere 0
  • bytes / limit_maxbytes — memoria utilizzata rispetto al totale allocato

memcstat (libmemcached-tools)

Il comando memcstat fornisce un output più leggibile rispetto a telnet:

memcstat --servers=127.0.0.1:11211

Tuning delle prestazioni

Il tuning di Memcached si concentra su tre aree: memoria, connessioni e slab allocator.

Eviction e TTL

Memcached usa un algoritmo LRU (Least Recently Used) per decidere quali item rimuovere quando la memoria è piena. Se le eviction sono alte, hai due opzioni: aumentare la memoria con -m o ridurre i TTL degli item meno critici per liberare spazio più velocemente.

Dimensione massima item (-I)

Il default è 1 MB per singolo item. Se l’applicazione deve cachare oggetti più grandi (es. pagine HTML complete o risultati di query complesse), aumenta il valore con -I 2m o -I 5m. Attenzione: item molto grandi consumano slab class intere e riducono l’efficienza dello slab allocator.

Connessioni (-c)

Ogni processo PHP-FPM apre una connessione persistente a Memcached. Se il server gestisce 100 worker PHP-FPM, servono almeno 100 connessioni. Imposta -c con un margine del 20-30% oltre il numero massimo di worker PHP previsti. Il default di 1024 è sufficiente per la maggior parte delle configurazioni.

Integrare Memcached con PHP e WordPress

Per utilizzare Memcached come Object Cache di WordPress, serve un drop-in object-cache.php nella directory wp-content/. Il metodo più affidabile è usare il plugin Memcached Object Cache (di Flavor) o scaricare direttamente il file object-cache.php dal repository WordPress.

Copia il file nella directory corretta:

cp wp-content/plugins/memcached/object-cache.php wp-content/object-cache.php

WordPress rileverà automaticamente il drop-in e utilizzerà Memcached per tutte le operazioni di Object Cache. Verifica nella pagina Strumenti → Salute del sito che il campo “Object Cache” riporti “Memcached” e non “File system”.

L’impatto è immediato: le query ripetitive al database vengono servite dalla RAM e il TTFB migliora sensibilmente, specialmente su pagine con molti widget, menu complessi e custom post type.

Per gestire l’invalidazione della cache dopo aggiornamenti del sito, ho sviluppato un plugin per rigenerare la cache che automatizza il processo di warm-up dopo ogni modifica.

Svuotare e invalidare la cache

Il comando flush_all invalida tutti gli item in cache. Non libera immediatamente la memoria — gli item vengono marcati come scaduti e sovrascritti progressivamente.

# Metodo 1: via netcat
echo "flush_all" | nc -q 2 localhost 11211

# Metodo 2: via memcflush (libmemcached-tools)
memcflush --servers=127.0.0.1:11211

# Metodo 3: riavvio del servizio (cache completamente svuotata)
sudo systemctl restart memcached

Nota: su un server che ospita più siti, flush_all invalida la cache di tutti i siti. Memcached non ha isolamento nativo fra applicazioni. Se hai bisogno di invalidazione selettiva, usa prefix/namespace diversi per ogni sito nella configurazione del drop-in WordPress.

Conclusione

Memcached rimane una soluzione efficace e leggera per il caching in-memory, particolarmente adatta a siti WordPress e CMS dinamici dove il pattern di accesso è prevalentemente in lettura. Il setup è semplice, il consumo di risorse è minimo e il guadagno in termini di TTFB è tangibile già dalla prima installazione.

Per approfondire le altre componenti dello stack di caching, consulta le guide su OPcache e Redis. Combinare OPcache (bytecode PHP), Memcached (object cache) e fastCGI cache (full page cache in Nginx) è la configurazione che offre le migliori prestazioni per siti ad alto traffico.

Articoli correlati

21 min lettura

Ridurre i tempi di risposta del server è vitale per abbattere il TTFB e dominare metriche come LCP e INP. Workflow tecnico per aumentare la velocità dell'hosting: dalla transizione verso VPS alla configurazione avanzata dello stack LEMP per ottenere server realmente accelerati.
33 mi piace
5 min lettura

Configurazione tecnica di Certbot per Nginx su Ubuntu 22.04 e 24.04 LTS. La procedura aggiornata per installare il client Let's Encrypt via Snap, abbandonare il vecchio PPA e automatizzare i certificati SSL/TLS 1.3, inclusa la gestione dei wildcard tramite DNS challenge.
13 mi piace

Autore

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Ultimi articoli aggiornati

16 min lettura

Metodologia operativa per la diagnosi di problemi su web server Linux tramite l'analisi dei log di sistema e applicativi. Il testo dettaglia l'ispezione di /var/log, l'interrogazione dei demoni con journalctl per monitorare lo stack LEMP e la configurazione di logrotate.
0 mi piace
21 min lettura

I crawler di Meta e Amazon generano milioni di richieste senza back-off: come quantificarli nei log, verificarne l'autenticità e fermarli con cache, robots.txt, rate limiting e WAF, senza perdere i link preview.
1 mi piace
22 min lettura

Difendere WordPress dai commenti spam con una strategia defense in depth a tre layer: configurazioni applicative, regole edge su Cloudflare, barriere a livello web server. Honeypot PHP, regole .htaccess e Nginx modernizzate, Cloudflare Turnstile, fail2ban. Snippet completi pronti da incollare.
0 mi piace
22 min lettura

Analisi tecnica della persistenza dei dati nel protocollo HTTP tramite header Set-Cookie. Comprendere la meccanica dei cookie, attributi come Max-Age e i limiti di Googlebot come crawler stateless è essenziale per diagnosticare problemi di rendering e involuntary cloaking.
4 mi piace
19 min lettura

Analisi dell'architettura RAG nativa per WordPress sviluppata interamente in PHP e MySQL, senza dipendenze da database vettoriali esterni. Il sistema supera i limiti della ricerca lessicale integrando la ricerca semantica su VPS o hosting condivisi con meno di 1GB di RAM.
3 mi piace

Richiedi un preventivo SEO e Google Ads

Porta il tuo sito web al livello successivo con l’esperienza di EVE Milano. La nostra agenzia di Search Marketing ha ricevuto oltre

User Access Addon Required

This shortcode requires the CF7 Database User Access addon to display data.

Please purchase and install the User Access addon to enable this feature.

Purchase User Access Addon

richieste di preventivo, un segnale chiaro della fiducia che imprenditori e manager, come te, ripongono nella nostra specializzazione tecnica e verticale nella SEO e PPC. Se la tua organizzazione cerca competenze specifiche per emergere nei risultati di Google, noi siamo pronti a fornire quel valore aggiunto. Richiedi un preventivo ora e scopri la differenza tra noi e gli altri.
Richiedi un preventivo

Vuoi ricevere un avviso al mese con le nuove guide pubblicate?

Iscriviti alla newsletter!