Comment migrer en douceur le DNS d'un serveur Web d'une adresse IP à une autre?

8

J'ai actuellement un nom de domaine enregistré pour un serveur Linux / Apache que je vais remplacer par un autre sur une nouvelle adresse IP.

La migration des données sera relativement rapide et une interruption de 5 minutes au cours de ce processus est acceptable.

L'enregistrement DNS a un TTL de 6 à 12 heures apparemment, que je ne peux pas accélérer.

Quelles sont les conséquences probables de ce changement? Vraisemblablement, les utilisateurs qui regardent toujours l'ancienne adresse continueront de frapper l'ancien serveur, tandis que les utilisateurs dont le cache DNS est expiré ou vide verront le nouveau domaine.

Est-il possible de faire une sorte de redirection de l'ancien serveur (avec Apache ou iptables) vers la nouvelle IP? L'ancien serveur peut continuer à fonctionner aussi longtemps que nécessaire.

À M
la source
J'ai utilisé rinetd qui est plus général qu'un vhost particulier, mais fonctionne parfaitement si vous remplacez le serveur entier, ou, par exemple, déplacez tous les éléments Web vers un autre serveur. Synchronisez simplement le nouveau serveur, configurez rinetd, changez DNS. Dans 48 heures, désactivez l'ancien serveur (ou ses services).
artfulrobot

Réponses:

5

Vous pouvez utiliser un proxy inverse sur l'ancien serveur Web. Cela peut être un peu difficile à configurer, mais tant que ITS DNS est à jour, tout ira bien.

Ce qui va arriver, c'est:

  1. L'ancien serveur Web est configuré pour être un proxy inverse
  2. Passage DNS
  3. Un nouveau serveur Web diffuse des hits à partir d'enregistrements DNS à jour
  4. Ancien site Web lorsqu'il obtient un hit, transmet la demande au DNS correct, puis sort le contenu textuellement.

Si vous exécutez Apache, regardez dans mod_proxy. Si vous exécutez IIS, examinez la réécriture ISAPI pour obtenir ce type de fonctionnalité.

(notez que le DNS sur l'ancien serveur Web doit être à jour si vous souhaitez utiliser un proxy en utilisant le nom de domaine. Sinon, le proxy directement à l'adresse IP et assurez-vous que l'hôte écoute sur l'IP sans nom d'hôte)

Mark Henderson
la source
1
Pour vous assurer que l'ancien serveur Web est mis à jour sur le nouveau DNS. Ajoutez l'enregistrement dans / etc / hosts.
Matthew Scragg
@MatthewScragg Pouvez-vous donner plus d'informations à ce sujet? Étapes et résultats ..
Birla
1
@Birla Sur l'ancien serveur Web, ajoutez à /etc/hosts 123.456.789.12 my.domain.comCeci ne fera que votre ancien serveur Web connaître l'adresse mise à jour. Lorsqu'un client accède à l'ancien serveur Web (car il n'a pas de DNS mis à jour), le serveur Web peut proxy la demande en utilisant le nom de domaine. Je n'utilise pas Apache mais voici un exemple Nginx: gist.github.com/scragg0x/738f144b33d17ef763d1
Matthew Scragg
11

Mon entreprise vient de le faire avec plusieurs sites Web de grande taille. La procédure de base que nous avons suivie était la suivante:

  1. Réduisez le TTL du domaine autant que possible. Faites-le à l'avance d'au moins autant de temps que le TTL actuel.
  2. Configurez le site Web sur le nouveau serveur exactement comme vous voulez que le "produit final" soit
  3. Ajoutez un nom alias au site sur le nouveau serveur, tel que www2.domain.com ou www-new.domain.com. Avec Apache, vous utiliseriez la directive ServerAlias . Si le site contient du code dynamique (PHP, mod_perl, RubyOnRails, etc.), assurez-vous que le site se comportera et répondra correctement avec ce nouveau nom.
  4. Au moment du basculement, configurez une redirection sur l'ancien serveur pointant vers le nouveau serveur
  5. Modifiez le DNS pour que www accède à la nouvelle IP.

Pour Apache, vous devriez probablement utiliser mod_rewrite pour la redirection afin de pouvoir conserver les URI demandés par le client. Une implémentation simple serait:

# 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>

Cela fera une redirection temporaire 302 pour www.domain.com/anything vers www-new.domain.com/anything. Vous voulez que ce soit temporaire car vous voulez probablement que les moteurs de recherche indexent uniquement www.domain.com, pas www-new.domain.com.

Une fois que le changement DNS pour www.domain.com s'est propagé à votre satisfaction, vous pouvez soit vider complètement www-new, soit faciliter doucement toute personne l'utilisant de nouveau vers www avec une autre redirection. C'est presque le même processus que ci-dessus; configurez l'ancien serveur pour gérer www-new, modifiez le DNS pour que www-new pointe vers l'ancien serveur et configurez une redirection sur l'ancien serveur en envoyant le trafic www-new vers 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>

Cette fois, vous voulez faire une redirection 301 permanente, encore une fois pour indiquer dans les robots des moteurs de recherche que www.domain.com est le site que vous souhaitez qu'ils indexent.

James Sneeringer
la source
4

Ok, sur la base de ce que @Farseeker a recommandé, j'ai mis en place la configuration suivante sur l'ancien serveur Apache pour transférer les requêtes sur le nouveau serveur:

<VirtualHost *>
  UseCanonicalName Off
  ServerAdmin  [email protected]
  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>

Pour m'assurer que l'ancien serveur avait la bonne adresse, j'ai mis une entrée dans /etc/hosts:

1.2.3.4 domain.com

J'ai également dû activer Apache mod_proxyet les mod_proxy_httpmodules et recharger la configuration:

a2enmod proxy
a2enmod proxy_http
/etc/init.d/apache force-reload
À M
la source
Agréable. Comment gérer des sous-domaines arbitraires, cependant?
Ekevoo
4

C'est un vieux fil mais peut-être que cela aidera quelqu'un:

En plus des réponses de Mark Henderson (mod_proxy) OU de James Sneeringer (302 301 redirection vers de nouveaux sous-domaines), une dernière chose pourrait être ajoutée concernant la synchronisation de la base de données lors du déplacement de grandes applications.

Si votre projet Web utilise une base de données (ex. MySQL), avant de changer de DNS, assurez-vous que les applications (ex. PHP) des deux serveurs se connectent à la même base de données. Pour que la lecture et l'écriture se fassent au même endroit et que vous n'ayez plus à vous occuper de différents outils de synchronisation DB par la suite.

Cela affecterait (très probablement) le temps de chargement sur un serveur, mais pour la période de commutation, cela peut être accepté.

Dans le cas où le serveur de base de données n'est pas accessible de l'extérieur, vous pouvez également configurer le mysql_proxy sur le serveur Web qui y a accès et est accessible à partir d'adresses IP externes.

cephuo
la source
3

J'utilise iptables pour cela lorsque je dois le faire; un peu de DNAT / SNAT et tout votre trafic réapparaît comme par magie. Si vous avez vraiment besoin de maintenir les adresses IP source, un proxy inverse peut vous aider, en définissant les en-têtes appropriés, mais cela nécessite beaucoup de faffings aux deux extrémités pour vous assurer que tout correspond, donc je ne m'inquiète pas normalement à ce sujet pour quelque chose comme une migration car elle est transitoire, et l'abaissement des TTL gère la majeure partie.

womble
la source