Perché il downtime è un problema nelle migrazioni WordPress
Per un sito aziendale o e-commerce, ogni minuto di downtime si traduce in perdita diretta di fatturato. Secondo dati Gartner 2025, il costo medio di un’ora di downtime per un’azienda medio-piccola è di circa €5.600. Per siti con traffico elevato, questa cifra può superare i €50.000.
Come agenzia, gestire migrazioni con downtime zero non è solo una questione tecnica: è un requisito professionale che distingue chi lavora in modo strutturato da chi improvvisa. Il cliente finale non deve nemmeno accorgersi che è in corso una migrazione.
Le situazioni più comuni che richiedono una migrazione WordPress includono:
- Cambio hosting per prestazioni o costi
- Passaggio da shared a VPS o cloud
- Consolidamento di infrastrutture multi-sito
- Migrazione da sviluppo a produzione
- Disaster recovery e backup restore
In tutti questi scenari, l’obiettivo è mantenere il sito accessibile e funzionante durante l’intero processo.
Preparazione pre-migrazione: analisi e pianificazione
Una migrazione senza downtime si vince nella fase di preparazione. Prima di toccare qualsiasi file o database, serve un audit completo del sito e un piano d’azione dettagliato.
Audit tecnico completo
Inizia raccogliendo tutti i dati tecnici del sito attuale:
- Dimensione totale dei file (wp-content, uploads, plugin, theme)
- Dimensione database MySQL (esegui
SELECT table_schema AS "Database", ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size (MB)" FROM information_schema.TABLES GROUP BY table_schema;) - Versione PHP, MySQL, WordPress core
- Lista completa di plugin e theme attivi con versioni
- Configurazioni server custom (php.ini, .htaccess, nginx.conf)
- Servizi esterni integrati (CDN, email, API, payment gateway)
- Certificati SSL e configurazione HTTPS
Usa WP-CLI per velocizzare la raccolta dati. Comandi utili:
wp core version
wp plugin list --format=table
wp theme list
wp db size --format=bytes
wp option get siteurl
wp option get home
Identificare i punti critici
Alcuni elementi richiedono attenzione particolare durante la migrazione:
- Path assoluti hardcoded: cerca nel database URL e path non gestiti da WordPress (serializzazioni custom, shortcode, builder page)
- Cron job e scheduled tasks: plugin di backup, invio newsletter, sincronizzazioni devono essere temporaneamente disabilitati
- Cache multipla: object cache, page cache, CDN cache vanno mappati e gestiti
- Sessioni utente attive: e-commerce con carrelli, utenti loggati, transazioni in corso
- DNS e propagazione: pianifica il TTL con almeno 48h di anticipo
Checklist pre-migrazione
Prima di procedere, verifica che siano soddisfatti questi requisiti:
- Backup completo verificato e testato (file + database)
- Accesso SSH/SFTP sia a server origine che destinazione
- Credenziali database vecchio e nuovo ambiente
- Lista whitelist IP per accesso staging
- Piano di rollback documentato
- Finestra di manutenzione concordata (anche se non servirà downtime)
- Stakeholder informati su tempistiche e processo
Strategia di migrazione: il metodo del doppio ambiente
La tecnica più affidabile per migrazioni senza downtime è il metodo del doppio ambiente: mentre il sito originale resta online e funzionante, si prepara una copia completa sul nuovo server, si testa tutto, e solo all’ultimo si esegue uno switch DNS quasi istantaneo.
Fase 1: Setup ambiente di destinazione
Sul nuovo server, configura l’ambiente identico o superiore a quello di origine:
- Installa stesso stack LAMP/LEMP (o superiore)
- Configura PHP con estensioni necessarie (gd, curl, mbstring, xml, zip, imagick)
- Crea database MySQL con collation utf8mb4_unicode_ci
- Configura utente database con privilegi corretti
- Imposta memory_limit, max_execution_time, upload_max_filesize adeguati
Verifica compatibilità con:
php -m | grep -E "mysqli|curl|gd|mbstring|xml|zip"
mysql --version
Fase 2: Migrazione iniziale file e database
Copia completa del sito sul nuovo server. Usa rsync per efficienza:
rsync -avz -e "ssh -p 22" --exclude 'wp-config.php' \
user@old-server:/var/www/html/ /var/www/newsite/
Esporta e importa il database:
# Sul server origine
wp db export - | gzip > database-export.sql.gz
# Sul server destinazione
gunzip < database-export.sql.gz | wp db import -
Aggiorna wp-config.php con nuove credenziali database:
define('DB_NAME', 'nuovo_database');
define('DB_USER', 'nuovo_user');
define('DB_PASSWORD', 'password_sicura');
define('DB_HOST', 'localhost');
Fase 3: Configurazione ambiente staging accessibile
Il nuovo sito deve essere accessibile per test, ma non pubblicamente. Opzioni:
- Subdomain temporaneo: staging.clientsite.com puntato al nuovo IP
- File hosts locale: modifica /etc/hosts per puntare il dominio al nuovo IP solo dalla tua postazione
- IP whitelisting: permetti accesso solo a IP agenzia tramite .htaccess o nginx
Esempio .htaccess per IP whitelisting:
Order Deny,Allow
Deny from all
Allow from 203.0.113.0/24
Allow from 198.51.100.50
Aggiorna URL nel database senza modificare il dominio reale (usa subdomain staging):
wp search-replace 'https://clientsite.com' 'https://staging.clientsite.com' \
--all-tables --precise
Testing completo sul nuovo ambiente
Prima dello switch definitivo, ogni funzionalità deve essere testata accuratamente. Non saltare questa fase: è qui che emergono il 90% dei problemi.
Checklist testing funzionale
- Frontend: naviga tutte le pagine principali, verifica immagini, CSS, JavaScript
- Backend: accedi a wp-admin, verifica editor, media library, plugin attivi
- Form e interazioni: testa contact form, newsletter signup, ricerca interna
- E-commerce: processo checkout completo (usa gateway test), calcolo spedizioni, tasse
- Utenti: login, registrazione, password reset, profili utente
- API e integrazioni: verifica chiamate a servizi esterni (CRM, analytics, email)
- Performance: misura TTFB, FCP, LCP con WebPageTest o GTmetrix
- Mobile: test responsive su device reali o BrowserStack
Test automatizzati con WP-CLI
Alcuni controlli possono essere automatizzati:
# Verifica integrità core
wp core verify-checksums
# Controlla plugin e theme aggiornabili
wp plugin list --update=available
wp theme list --update=available
# Test database
wp db check
wp db optimize
# Verifica permalink
wp rewrite flush
wp rewrite list
Monitoraggio errori e log
Abilita debug logging sul nuovo ambiente per intercettare warning e errori:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
define('SCRIPT_DEBUG', true);
Monitora i log in tempo reale:
tail -f /var/www/newsite/wp-content/debug.log
tail -f /var/log/nginx/error.log
Sincronizzazione continua pre-switch
Dal momento della migrazione iniziale allo switch DNS possono passare ore o giorni. Nel frattempo, il sito originale continua a ricevere aggiornamenti: nuovi contenuti, ordini, commenti, utenti.
Per evitare perdita di dati, serve una strategia di sincronizzazione continua.
Sincronizzazione database incrementale
Usa script per sincronizzare solo le tabelle che cambiano frequentemente:
#!/bin/bash
# sync-db-incremental.sh
TABLES="wp_posts wp_postmeta wp_comments wp_users wp_usermeta wp_woocommerce_order_items"
for table in $TABLES; do
mysqldump -h old-server.com -u user -p database $table | \
mysql -h localhost -u newuser -pnewpass newdatabase
done
Esegui questo script ogni 15-30 minuti tramite cron fino allo switch.
Sincronizzazione file uploads
Per wp-content/uploads, usa rsync incrementale:
*/15 * * * * rsync -avz --delete \
user@old-server:/var/www/html/wp-content/uploads/ \
/var/www/newsite/wp-content/uploads/
Per siti con volumi elevati di upload, considera soluzioni come:
- Storage condiviso (NFS, S3) tra vecchio e nuovo server
- Plugin di sync real-time (WP Offload Media per S3)
- CDN con origin shield per servire assets da entrambi i server
Gestione e-commerce e transazioni
Per WooCommerce o shop con transazioni continue:
- Pianifica switch in orario di basso traffico (notte, weekend)
- Attiva modalità manutenzione solo su checkout/cart (non tutto il sito)
- Sincronizza ordini fino a 5 minuti prima dello switch
- Verifica gateway payment siano configurati correttamente (webhook URL)
Lo switch DNS: il momento critico
Quando tutto è testato e sincronizzato, è il momento dello switch. Questo è l'unico momento con potenziale micro-downtime (secondi, non minuti).
Preparazione DNS
Almeno 48 ore prima, abbassa il TTL dei record DNS a 300 secondi (5 minuti):
clientsite.com. 300 IN A 203.0.113.10
Questo permette propagazione rapida quando cambierai l'IP.
Sincronizzazione finale
10 minuti prima dello switch:
- Esegui ultima sincronizzazione database completa
- Sincronizza uploads con rsync finale
- Opzionale: attiva pagina manutenzione sul vecchio sito (solo per form submission e login)
Cambio DNS
Aggiorna il record A (o CNAME) puntando al nuovo server IP:
clientsite.com. 300 IN A 198.51.100.50
Usa servizi come CloudFlare o AWS Route53 per switch più rapido (propagazione ~1 minuto).
Aggiornamento URL nel database
Sul nuovo server, sostituisci staging URL con quello definitivo:
wp search-replace 'https://staging.clientsite.com' 'https://clientsite.com' \
--all-tables --precise
wp cache flush
Verifica SSL e HTTPS
Configura certificato SSL sul nuovo server (Let's Encrypt o certificato esistente):
certbot --nginx -d clientsite.com -d www.clientsite.com
Forza HTTPS in wp-config.php:
define('FORCE_SSL_ADMIN', true);
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS'] = 'on';
Post-migrazione: monitoraggio e ottimizzazione
Lo switch è completato, ma il lavoro non finisce qui. Le prime 24-48 ore sono critiche per intercettare problemi.
Monitoraggio immediato
Nelle prime ore post-migrazione:
- Verifica uptime ogni 5 minuti (UptimeRobot, Pingdom)
- Monitora error log server e WordPress debug.log
- Controlla Google Search Console per errori crawling
- Verifica Analytics continui a tracciare correttamente
- Testa form e-commerce con transazioni reali
Ottimizzazioni performance
Con il sito stabile sul nuovo server, ottimizza:
- Configura object cache (Redis o Memcached)
- Attiva page caching (Nginx FastCGI cache, WP Rocket, o W3TC)
- Ottimizza immagini esistenti (WP-CLI + ImageMagick)
- Configura CDN e cache browser headers
- Abilita HTTP/2 o HTTP/3 su server
# Object cache Redis
wp redis enable
# Ottimizzazione immagini batch
wp media regenerate --image_size=all --yes
Documentazione e handover
Completa la migrazione con documentazione per il cliente:
- Credenziali aggiornate (hosting, database, wp-admin)
- Modifiche configurazione server
- Backup schedule sul nuovo ambiente
- Procedure rollback in caso emergenza
- Contatti supporto nuovo hosting
Troubleshooting: problemi comuni e soluzioni
Problema: Mixed content warnings dopo switch HTTPS
Soluzione: cerca URL hardcoded HTTP nel database:
wp search-replace 'http://clientsite.com' 'https://clientsite.com' \
--all-tables --report-changed-only
Aggiungi header Content-Security-Policy per forzare HTTPS:
add_action('send_headers', function() {
header('Content-Security-Policy: upgrade-insecure-requests');
});
Problema: Plugin non funzionanti sul nuovo server
Causa comune: path assoluti o permessi file. Verifica:
# Permessi corretti
find /var/www/newsite -type d -exec chmod 755 {} \;
find /var/www/newsite -type f -exec chmod 644 {} \;
# Owner corretto
chown -R www-data:www-data /var/www/newsite
Problema: Performance peggiorate dopo migrazione
Checklist diagnostica:
- Verifica configurazione PHP OpCache attiva
- Controlla slow query log MySQL
- Testa TTFB con
curl -w "@curl-format.txt" -o /dev/null -s https://clientsite.com - Verifica non ci siano plugin debug attivi
- Controlla limitazioni risorse server (RAM, CPU, IOPS)
Problema: Email non inviate dal nuovo server
Soluzione: configura SMTP esterno (non usare mail() PHP):
// wp-config.php
define('SMTP_HOST', 'smtp.mailgun.org');
define('SMTP_PORT', 587);
define('SMTP_USER', 'postmaster@mg.clientsite.com');
define('SMTP_PASS', 'password');
Oppure usa plugin WP Mail SMTP o Post SMTP.
Strumenti e plugin consigliati per agenzie
Stack strumenti professionali per migrazioni:
- WP-CLI: indispensabile per automazione e operazioni batch
- WP Migrate DB Pro: sincronizzazione database push/pull tra ambienti
- Duplicator Pro: backup e migrazione completa con script installer
- All-in-One WP Migration: alternativa user-friendly per siti fino 512MB
- WP Stagecoach: gestione staging environment automatizzato
- ManageWP: orchestrazione migrazioni multiple per agenzie
- ServerPilot o RunCloud: gestione server semplificata con staging built-in
Tool esterni:
- CloudFlare: DNS con TTL bassi e switch rapido + DDoS protection
- UptimeRobot: monitoring uptime gratuito ogni 5 minuti
- New Relic o Datadog: monitoring performance APM per siti enterprise
- WebPageTest: test performance comparativi pre/post migrazione
Automazione: script per migrazioni ripetibili
Per agenzie che gestiscono migrazioni frequenti, vale la pena investire in automazione.
Script bash migrazione completa
#!/bin/bash
# wordpress-migration.sh
SOURCE_HOST="old-server.com"
SOURCE_PATH="/var/www/html"
DEST_PATH="/var/www/newsite"
DB_NAME="wordpress_db"
echo "[1/5] Syncing files..."
rsync -avz --exclude 'wp-config.php' \
user@$SOURCE_HOST:$SOURCE_PATH/ $DEST_PATH/
echo "[2/5] Exporting database..."
ssh user@$SOURCE_HOST "wp db export - --path=$SOURCE_PATH" | \
wp db import - --path=$DEST_PATH
echo "[3/5] Updating URLs..."
wp search-replace "$SOURCE_HOST" "$DEST_HOST" \
--path=$DEST_PATH --all-tables
echo "[4/5] Flushing cache..."
wp cache flush --path=$DEST_PATH
wp rewrite flush --path=$DEST_PATH
echo "[5/5] Setting permissions..."
chown -R www-data:www-data $DEST_PATH
find $DEST_PATH -type d -exec chmod 755 {} \;
find $DEST_PATH -type f -exec chmod 644 {} \;
echo "Migration complete!"
Integrazione con AgencyPilot
Se usi AgencyPilot per gestire siti client, puoi:
- Monitorare stato migrazione real-time da dashboard centrale
- Automatizzare checklist pre/post migrazione per ogni sito
- Schedulare sincronizzazioni database incrementali
- Ricevere alert automatici su errori o downtime
- Documentare processo e credenziali in modo strutturato
L'integrazione con WP-CLI permette di eseguire comandi su tutti i siti gestiti tramite API AgencyPilot.
Conclusioni operative
Una migrazione WordPress senza downtime richiede pianificazione, strumenti adeguati e attenzione ai dettagli. Il metodo del doppio ambiente con sincronizzazione continua è la strategia più affidabile per agenzie che non possono permettersi errori.
I punti chiave da ricordare:
- Investi tempo nella preparazione e testing: previene il 90% dei problemi
- Usa automazione dove possibile: WP-CLI, rsync, script personalizzati
- Sincronizza database e files continuamente fino allo switch
- Abbassa TTL DNS con 48h anticipo per propagazione rapida
- Monitora attentamente le prime 48h post-migrazione
- Documenta tutto per riferimento futuro e handover cliente
Con questo approccio strutturato, puoi garantire migrazioni professionali che i clienti nemmeno percepiscono, mantenendo reputazione e standard di qualità elevati.
FAQ
Quanto tempo richiede una migrazione WordPress senza downtime?
Dipende dalla dimensione del sito. Per un sito standard (5-10GB, database 100-500MB), calcola: 2-3 ore per setup iniziale e migrazione, 4-8 ore per testing completo, 1-2 giorni per sincronizzazione continua se necessario. Lo switch DNS finale richiede 5-15 minuti. In totale, pianifica 2-4 giorni lavorativi per gestire l'intero processo in modo professionale, anche se il downtime effettivo sarà zero.
È possibile migrare un e-commerce WooCommerce senza perdere ordini?
Sì, usando sincronizzazione database incrementale. Configura uno script che sincronizza le tabelle degli ordini ogni 10-15 minuti fino allo switch DNS. Pianifica lo switch in orario di basso traffico (es. 3-4 AM) e sincronizza ordini fino a 5 minuti prima. Verifica che webhook dei payment gateway (PayPal, Stripe) siano aggiornati con i nuovi URL. Dopo lo switch, controlla che non ci siano ordini pending sul vecchio server.
Cosa fare se qualcosa va storto durante lo switch DNS?
Preparati con un piano di rollback: mantieni il vecchio server attivo per almeno 48 ore dopo lo switch. Se emergono problemi critici, puoi invertire il record DNS puntando nuovamente al vecchio IP. Con TTL a 300 secondi, la propagazione inversa richiede 5-30 minuti. Per questo motivo, non spegnere mai il vecchio server immediatamente dopo lo switch. Conserva backup completi di entrambi gli ambienti fino a conferma stabilità.
Come gestire la cache CDN durante la migrazione?
Prima dello switch DNS, configura il CDN sul nuovo server ma non attivarlo. Dopo lo switch, purga completamente la cache CDN (Cloudflare: Purge Everything, o via API). Se usi plugin cache come WP Rocket, disabilita CDN temporaneamente durante lo switch e riattivalo dopo 30 minuti. Monitora che il CDN punti correttamente al nuovo origin server verificando gli header HTTP della risposta.
È necessario avvisare Google della migrazione se l'URL non cambia?
No, se il dominio resta identico, Google non percepisce la migrazione come cambio di sito. Tuttavia, monitora Google Search Console per eventuali errori di crawling nelle 48 ore successive. Verifica che robots.txt, sitemap.xml e canonical tag siano identici al vecchio sito. Se cambi da HTTP a HTTPS durante la migrazione, aggiungi la nuova property HTTPS in Search Console e imposta redirect 301 permanenti da HTTP a HTTPS.