Come faccio a migrare senza problemi il DNS di un server Web da un indirizzo IP a un altro?


8

Al momento ho un nome di dominio registrato per un server Linux / Apache che sostituirò con un altro su un nuovo indirizzo IP.

La migrazione dei dati sarà relativamente rapida ed è accettabile un'interruzione di 5 minuti durante tale processo.

Il record DNS ha apparentemente un TTL di 6-12 ore, che non posso accelerare.

Quali sono le probabili conseguenze di questo cambiamento? Presumibilmente gli utenti che stanno ancora guardando il vecchio indirizzo continueranno a colpire il vecchio server, mentre gli utenti che hanno la cache DNS sono scaduti o vuoti vedranno il nuovo dominio.

È possibile eseguire una sorta di reindirizzamento dal vecchio server (con Apache o iptables) al nuovo IP? Il vecchio server può continuare a funzionare per tutto il tempo necessario.


Ho usato Rinetd, che è più generale di un particolare vhost, ma funziona perfettamente se stai sostituendo l'intero server o, diciamo, spostando tutto il Web su un altro server. Sincronizza il nuovo server, configura rinetd, cambia DNS. In 48 ore spegni il vecchio server (oi suoi servizi).
artfulrobot,

Risposte:


5

È possibile utilizzare un proxy inverso sul vecchio server Web. Potrebbe essere un po 'di lavoro da impostare, ma solo a patto che ITS DNS è aggiornato voi sarà OK.

Quello che accadrà è:

  1. Il vecchio server Web è configurato per essere proxy inverso
  2. Passaggio al DNS
  3. Il nuovo server Web fornisce hit da record DNS aggiornati
  4. Vecchio web quando ottiene un successo, inoltra la richiesta al DNS corretto e quindi genera il contenuto alla lettera.

Se stai eseguendo Apache, cerca in mod_proxy. Se stai eseguendo IIS, cerca ISAPI Rewrite per ottenere questo tipo di funzionalità.

(notare che il DNS sul vecchio server Web deve essere aggiornato se si desidera eseguire il proxy utilizzando il nome di dominio. Altrimenti, delegarlo direttamente all'indirizzo IP e assicurarsi che l'host sia in ascolto sull'IP senza un nome host)


1
Per assicurarsi che il vecchio server web sia aggiornato sul nuovo DNS. Aggiungi il record a / etc / hosts.
Matthew Scragg,

@MatthewScragg Puoi darci qualche informazione in più al riguardo? Passaggi e risultati ..
Birla,

1
@Birla Sul vecchio server web, aggiungi a /etc/hosts 123.456.789.12 my.domain.comQuesto consentirà solo al tuo vecchio server web di conoscere l'indirizzo aggiornato. Quando un client accede al vecchio server web (perché non ha un DNS aggiornato), il server Web può eseguire il proxy della richiesta utilizzando il nome di dominio. Non uso Apache ma ecco un esempio di Nginx: gist.github.com/scragg0x/738f144b33d17ef763d1
Matthew Scragg

11

La mia azienda ha appena fatto questo con diversi siti Web di grandi dimensioni. La procedura di base che abbiamo seguito è stata:

  1. Riduci il più possibile il TTL del dominio. Fallo in anticipo almeno quanto il TTL attuale.
  2. Impostare il sito Web sul nuovo server esattamente come si desidera che il "prodotto finale" sia
  3. Aggiungi un nome con alias al sito sul nuovo server, ad esempio www2.domain.com o www-new.domain.com. Con Apache, useresti la direttiva ServerAlias . Se il sito ha qualche codice dinamico (PHP, mod_perl, RubyOnRails, ecc.), Assicurati che il sito si comporti e risponda correttamente con questo nuovo nome.
  4. Al momento del ritaglio, impostare un reindirizzamento sul vecchio server che punta al nuovo server
  5. Cambia DNS per www per passare al nuovo IP.

Per Apache, probabilmente dovresti usare mod_rewrite per il reindirizzamento in modo da poter preservare gli URI richiesti dal client. Una semplice implementazione sarebbe:

# old server
<VirtualHost 1.1.1.1:80>
    ServerName www.domain.com
    RewriteEngine on
    RewriteRule ^(.*)$ http://www-new.domain.com$1 [L]
</VirtualHost>

# new server
<VirtualHost 1.1.1.2:80>
    ServerName www.domain.com
    ServerAlias www-new.domain.com
</VirtualHost>

Ciò eseguirà un reindirizzamento temporaneo 302 per www.domain.com/anything su www-new.domain.com/anything. Vuoi che sia temporaneo perché probabilmente vuoi che i motori di ricerca indicizzino solo www.domain.com, non www-new.domain.com.

Una volta che la modifica DNS per www.domain.com si è propagata in modo soddisfacente, è possibile eseguire il dump di www-new del tutto o facilitare delicatamente chiunque lo usi su www con un altro reindirizzamento. È quasi lo stesso processo di cui sopra; imposta il vecchio server per gestire www-new, cambia DNS per www-new in modo che punti al vecchio server e imposta un reindirizzamento sul vecchio server inviando www-new traffic a www:

# old server
<VirtualHost 1.1.1.1:80>
   ServerName www-new.domain.com
   RewriteEngine on
   RewriteRule ^(.*)$ http://www.domain.com$1 [R=301,L]
</VirtualHost>

# new server
<VirtualHost 1.1.1.2:80>
    ServerName www.domain.com
    # ServerAlias removed, no longer needed
</VirtualHost>

Questa volta vuoi fare un reindirizzamento permanente 301, ancora una volta per capire nei crawler dei motori di ricerca che www.domain.com è il sito che desideri indicizzare.


4

Ok, in base a quanto raccomandato da @Farseeker, ho impostato la seguente configurazione sul vecchio server Apache per inoltrare le richieste al nuovo server:

<VirtualHost *>
  UseCanonicalName Off
  ServerAdmin  me@domain.com
  ServerName domain.com
  DocumentRoot /var/www/

  ProxyRequests Off

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  ProxyPass / http://domain.com/
  ProxyPassReverse / http://domain.com/
</VirtualHost>

Per essere sicuro che il vecchio server avesse l'indirizzo corretto, ho inserito una voce /etc/hosts:

1.2.3.4 domain.com

Ho anche dovuto abilitare Apache mod_proxye mod_proxy_httpmoduli e ricaricare la configurazione:

a2enmod proxy
a2enmod proxy_http
/etc/init.d/apache force-reload

Bello. Come gestire sottodomini arbitrari, però?
Ekevoo,

4

È un vecchio thread ma forse aiuterà qualcuno:

Oltre alle risposte di Mark Henderson (mod_proxy) OR James Sneeringer (302.301 reindirizzamento a nuovi sottodomini), è possibile aggiungere un'altra cosa per quanto riguarda la sincronizzazione del database quando si spostano grandi applicazioni.

Se il tuo progetto web utilizza un database (es. MySQL), prima di cambiare DNS, assicurati che le applicazioni (es. PHP) di entrambi i server si connettano allo stesso database. In modo che lettura e scrittura vadano nello stesso posto e non dovrai più occuparti di strumenti di sincronizzazione DB diversi.

Ciò (molto probabilmente) influirebbe sul tempo di caricamento su un server ma per il periodo di commutazione questo può essere accettato.

Nel caso in cui il server DB non sia accessibile dall'esterno, è possibile configurare anche mysql_proxy sul server Web che ha accesso ad esso ed è accessibile da IP esterni.


3

Uso iptables per questo quando devo farlo; un po 'di DNAT / SNAT e tutto il traffico riappare magicamente dove dovrebbe essere. Se hai davvero bisogno di mantenere gli indirizzi IP di origine, un proxy inverso può aiutarti, impostando le intestazioni appropriate, ma ciò richiede un sacco di dissolvenze su entrambe le estremità per assicurarsi che tutto corrisponda, quindi normalmente non me ne preoccupo per qualcosa di simile a una migrazione in quanto transitorio e l'abbassamento dei TTL ne gestisce la maggior parte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.