3 Febbraio 2023

Come affrontare migrazioni di siti d’urgenza fregandosene della propagazione DNS e vivere felici.

Può capitare di imbatterci in situazioni in cui il TTL dei DNS sia impostato ad un giorno o più. Come far vedere subito il sito migrato ?

Nei nostri post passati abbiamo sempre dato importanza e risalto su quanto siano importanti i servizi di DNS e di come sia fondamentale avere un TTL basso per non incorrere in problemi gravi come ad esempio dover cambiare IP d’urgenza e trovarsi impossibilitati in una propagazione veloce perchè il Time To Live (TTL) è impostato ad un giorno o più.

Potete trovare un articolo di approfondimento sul TTL dei DNS in questo post, tuttavia è anche vero che spesso si viene coinvolti d’urgenza in situazioni di pericolo in cui è necessaria una migrazione immediata di un sito web da un server ad un altro server e ci si accorge che il proprietario, il webmaster o il precedente sistemista non ha impostato il TTL dei DNS ad un valore consono come ad esempio 5, 15, 30 minuti o un’ora al massimo.

Magari la migrazione del sito e del database e la ricreazione dell’ambiente la facciamo in 1 ora, però poi dobbiamo aspettare fino ad un giorno se ci troviamo un TTL di 86400 secondi impostato, e questo in ambienti di produzione con siti che fanno traffico può essere deleterio ed estremamente dannoso in termini di immagine, visibilità, SEO, mancate vendite e fatturato.

In questo post andremo dunque a vedere come comportarsi in casi d’urgenza in cui si deve migrare un sito da un server ad un altro server, bypassando i limiti del DNS e facendo “propagare” il nuovo sito subito.

E’ richiesto ovviamente un accesso root alla macchina di origine in modo da poter lanciare comandi privilegiati.

Caso 1: Un server che gestisce un solo sito o più siti che vanno migrati in blocco su una seconda macchina.

Immaginiamo di avere un server che contiene 100 vhost, che debbono essere migrati in blocco su una seconda macchina, di questi 100 vhost, di 50 abbiamo noi la gestione del DNS, e dei restanti 50 i rispettivi clienti, su registrar diversi come ad esempio Aruba, OVH, InternetBS, Register, Godaddy, e con i più disparati valori di TTL che vanno da 5 minuti ad una settimana.

Come gestire dunque questa situazione affinchè la migrazione vada in porto correttamente e i dati siano aggiornati evitando di dover fare più migrazioni ed allineare ad esempio i post o gli ordini e le giacenze di siti che continuano a viaggiare sul server primario invece del server secondario ?

In questo caso l’opzione più sensata è quella di migrare file con rsync su un nuovo server, il database grezzo sul nuovo server, generare i pool PHP-FPM, la configurazione del webserver Apache, i certificati SSL ed avviare le istanze.

iptables-filter

Sul server primario, quello di origine, andremo a spegnere i servizi DB, PHP e Web ed a quel punto istruiremo il firewall iptables a livello di rete di forwardare tutto il traffico entrante e destinato alle porte HTTP ed HTTPS (ovvero la porta 80 e la porta 443) verso le rispettive porte della nuova macchina.

La sintassi è molto banale ed è la seguente :

sysctl net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination IPDIDESTINAZIONE:80
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination IPDIDESTINAZIONE:443
iptables -t nat -A POSTROUTING -j MASQUERADE

Ovviamente l’esempio sopra riportato tiene conto di voler utilizzare iptables di Linux come port forwarder, magari per motivi inerenti alla rottura di un disco, un boot con una linux live, o simili, ma il concetto alla base è applicabile e proponibile a qualsiasi sistema operativo con software diversi.

Così facendo potremmo sin da subito iniziare ad usare i servizi web che già stanno girando sul nuovo server e poi istruire con calma i proprietari dei siti di cambiare il puntamento dei record DNS verso il nuovo IP, dando ad esempio come deadline un mese. Dopo un mese andremo a spegnere il server di origine, avendo tenuto conto che i clienti che gestivano in autonomia la loro zona DNS hanno ricevuto la comunicazione ed hanno avuto un tempo più che sufficiente per apportare le modifiche.

Caso 2 : un server che gestisce più siti di cui solo alcuni vanno migrati in blocco su una seconda macchina.

La casistica di esempio, è simile alla precedente, la differenza principale e fondamentale sta nel fatto che non tutti i siti vanno migrati sulla seconda macchina e dunque non posso istruire il firewall di rete a fare un port forwarding dell’intero traffico HTTP ed HTTPS sulla seconda macchina.

Debbo invece selezionare quale vhost andranno sulla seconda macchina e far si che i vhost della prima macchina siano istruiti per andare a pescare i dati e forwardare traffico HTTP ed HTTPS dalla seconda macchina.

In questo caso invece di utilizzare port forwarding a livello di rete andrò ad usare un Reverse Proxy.

Reverse Proxy

Nelle reti informatiche un reverse proxy è un tipo di proxy che recupera i contenuti per conto di un client da uno o più server. Questi contenuti sono poi trasferiti al client come se provenissero dallo stesso proxy, che quindi appare al client come un server.

Per far ciò bisognerà andare nei rispettivi file di configurazione del webserver (immaginiamo Apache 2.4 o NGINX ad esempio) e specificare una serie di istruzioni affinchè si possa fare il reverse proxy dei siti già ospitati sulla seconda macchina.

Reverse Proxy in Apache 2.4

Vediamo di seguito una configurazione breve di un reverse proxy in Apache 2.4 con direttive specifiche sia per forwardare HTTP ed HTTPS nonchè evitare il check del certificato HTTPS sulla seconda macchina perchè magari ancora non abbiamo ottenuto un certificato HTTPS con Let’s Encrypt o simile.

Non andremo a trattare ovviamente tutte le direttive di Apache o il fatto che bisogna inserire moduli per far funzionare reverse proxy che può essere fatto su Debian ad esempio utilizzando : sudo a2enmod proxy && sudo a2enmod proxy_http && a2enmod ssl

<VirtualHost *:80>

ServerName fcnauticaweb.com
ServerAlias www.fcnauticaweb.com

ProxyPass / http://65.109.65.190:80/
ProxyPassReverse / http://65.109.65.190:80/
ProxyRequests Off

</VirtualHost>

<VirtualHost *:443>

ServerName fcnauticaweb.com
ServerAlias www.fcnauticaweb.com

<IfModule mod_ssl.c>
SSLEngine on
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

SSLCertificateFile /var/www/clients/client0/web1/ssl/fcnauticaweb.com-le.crt
SSLCertificateKeyFile /var/www/clients/client0/web1/ssl/fcnauticaweb.com-le.key
</IfModule>

SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off

ProxyPass / https://65.109.65.190:443/
ProxyPassReverse / https://65.109.65.190:443/
ProxyRequests Off
ProxyPreserveHost On
</VirtualHost>

Nell’esempio sopra andiamo a forwardare un vhost che risponde al nome a dominio fcnauticaweb.com ad un web server con IP 65.109.65.190, dopodichè andremo a riavviare il web server apache tramite il comando apachectl restart.

Tutto il traffico HTTP ed HTTPS verrà forwardato alla seconda macchina con IP 65.109.65.190 e poi con “calma” ci si preoccuperà di puntare il record DNS per il dominio web all’indirizzo IP voluto, considerando che l’attuale TTL è impostato a 86400 secondi (un giorno) ed una modifica anche immediata avrebbe comportato un tempo di propagazione fino a 86400 secondi.

dig-TTL-DNS

Reverse Proxy su NGINX.

Nell’esempio precedente abbiamo utilizzato Apache perchè il sistema originario utilizzava un pannello ISPConfig basato appunto su Apache 2.4, tuttavia avremmo potuto trovare un altro web server molto diffuso ultimamente nonchè il nostro preferito NGINX.

Anche in questo caso la cosa è molto facile e semplice considerando che la sintassi è simile e che NGINX a differenza di quello schifo di Apache non necessita di moduli aggiuntivi per fungere da reverse proxy, dato che in NGINX la funzione di reverse proxy è utilizzatissima quasi più di quella di web server.

NGINX Banner

 

Andiamo dunque a vedere come sarebbe stata la stessa configurazione in NGINX:

server {

listen 80;
server_name fcnauticaweb.com www.fcnauticaweb.com;
rewrite ^ https://www.fcnauticaweb.com? permanent;

}

server {

listen 443 ssl http2;
server_name fcnauticaweb.com www.fcnauticaweb.com;
root /home/mir-project/project/;

ssl on;
ssl_certificate /etc/letsencrypt/live/fcnauticaweb.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/fcnauticaweb.com/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256;
ssl_prefer_server_ciphers on; ssl_early_data on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_cache shared:SSL:10m;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/fcnauticaweb.com/fullchain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;


location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_pass https://65.109.65.190:443;


}

}

Utilizzando queste tecniche sopra descritte non dovrete essere in balia di scelte e condizionamenti altrui, potrete ridurre i tempi di attesa e andare ad operare di urgenza nel vero senso della parola, ovvero ricevere richieste e garantire la soluzione entro un tempo specifico di una o due ore, un tempo utile per il committente finale che spesso non tecnico, non conosce il funzionamento della risoluzione dei nomi a dominio, ne delle limitazioni tecniche che essi impongono.

Hai dei dubbi? Non sai da dove iniziare? Contattaci !

Abbiamo tutte le risposte alle tue domande per aiutarti nella giusta scelta.

Chatta con noi

Chatta direttamente con il nostro supporto prevendita.

0256569681

Contattaci telefonicamente negli orari d’ufficio 9:30 – 19:30

Contattaci online

Apri una richiesta direttamente nell’area dei contatti.

INFORMAZIONI

Managed Server S.r.l. è un player italiano di riferimento nel fornire soluzioni avanzate di sistemistica GNU/Linux orientate all’alta performance. Con un modello di sottoscrizione dai costi contenuti e prevedibili, ci assicuriamo che i nostri clienti abbiano accesso a tecnologie avanzate nel campo dell’hosting, server dedicati e servizi cloud. Oltre a questo, offriamo consulenza sistemistica su sistemi Linux e manutenzione specializzata in DBMS, IT Security, Cloud e molto altro. Ci distinguiamo per l’expertise in hosting di primari CMS Open Source come WordPress, WooCommerce, Drupal, Prestashop, Joomla, OpenCart e Magento, affiancato da un servizio di supporto e consulenza di alto livello adatto per la Pubblica Amministrazione, PMI, ed aziende di qualsiasi dimensione.

Red Hat, Inc. detiene i diritti su Red Hat®, RHEL®, RedHat Linux®, e CentOS®; AlmaLinux™ è un marchio di AlmaLinux OS Foundation; Rocky Linux® è un marchio registrato di Rocky Linux Foundation; SUSE® è un marchio registrato di SUSE LLC; Canonical Ltd. detiene i diritti su Ubuntu®; Software in the Public Interest, Inc. detiene i diritti su Debian®; Linus Torvalds detiene i diritti su Linux®; FreeBSD® è un marchio registrato di The FreeBSD Foundation; NetBSD® è un marchio registrato di The NetBSD Foundation; OpenBSD® è un marchio registrato di Theo de Raadt. Oracle Corporation detiene i diritti su Oracle®, MySQL®, e MyRocks®; Percona® è un marchio registrato di Percona LLC; MariaDB® è un marchio registrato di MariaDB Corporation Ab; REDIS® è un marchio registrato di Redis Labs Ltd. F5 Networks, Inc. detiene i diritti su NGINX® e NGINX Plus®; Varnish® è un marchio registrato di Varnish Software AB. Adobe Inc. detiene i diritti su Magento®; PrestaShop® è un marchio registrato di PrestaShop SA; OpenCart® è un marchio registrato di OpenCart Limited. Automattic Inc. detiene i diritti su WordPress®, WooCommerce®, e JetPack®; Open Source Matters, Inc. detiene i diritti su Joomla®; Dries Buytaert detiene i diritti su Drupal®. Amazon Web Services, Inc. detiene i diritti su AWS®; Google LLC detiene i diritti su Google Cloud™ e Chrome™; Microsoft Corporation detiene i diritti su Microsoft®, Azure®, e Internet Explorer®; Mozilla Foundation detiene i diritti su Firefox®. Apache® è un marchio registrato di The Apache Software Foundation; PHP® è un marchio registrato del PHP Group. CloudFlare® è un marchio registrato di Cloudflare, Inc.; NETSCOUT® è un marchio registrato di NETSCOUT Systems Inc.; ElasticSearch®, LogStash®, e Kibana® sono marchi registrati di Elastic N.V. Hetzner Online GmbH detiene i diritti su Hetzner®; OVHcloud è un marchio registrato di OVH Groupe SAS; cPanel®, L.L.C. detiene i diritti su cPanel®; Plesk® è un marchio registrato di Plesk International GmbH; Facebook, Inc. detiene i diritti su Facebook®. Questo sito non è affiliato, sponsorizzato o altrimenti associato a nessuna delle entità sopra menzionate e non rappresenta nessuna di queste entità in alcun modo. Tutti i diritti sui marchi e sui nomi di prodotto menzionati sono di proprietà dei rispettivi detentori di copyright. Ogni altro marchio citato appartiene ai propri registranti. MANAGED SERVER® è un marchio registrato a livello europeo da MANAGED SERVER SRL, Via Enzo Ferrari, 9, 62012 Civitanova Marche (MC), Italia.

Torna in alto