Wie migriere ich das DNS eines Webservers reibungslos von einer IP-Adresse zu einer anderen?

8

Ich habe derzeit einen Domainnamen für einen Linux / Apache-Server registriert, den ich unter einer neuen IP-Adresse durch einen anderen ersetzen werde.

Die Migration der Daten ist relativ schnell und eine Unterbrechung von 5 Minuten während dieses Vorgangs ist akzeptabel.

Der DNS-Eintrag hat anscheinend eine TTL von 6-12 Stunden, die ich nicht beschleunigen kann.

Was sind die wahrscheinlichen Folgen dieser Änderung? Vermutlich werden Benutzer, die immer noch auf die alte Adresse schauen, weiterhin auf den alten Server zugreifen, während Benutzer, deren DNS-Cache abgelaufen ist oder leer ist, die neue Domäne sehen.

Ist es möglich, eine Art Umleitung vom alten Server (mit Apache oder iptables) zur neuen IP durchzuführen? Der alte Server kann so lange wie nötig weiterlaufen.

Tom
quelle
Ich habe rinetd verwendet, das allgemeiner ist als ein bestimmter vhost, aber hervorragend funktioniert, wenn Sie den gesamten Server ersetzen oder beispielsweise alle Web-Inhalte auf einen anderen Server verschieben. Synchronisieren Sie einfach den neuen Server, richten Sie rinetd ein und ändern Sie den DNS. Schalten Sie in 48 Stunden den alten Server (oder seine Dienste) aus.
Artfulrobot

Antworten:

5

Sie können einen Reverse Proxy auf dem alten Webserver verwenden. Das Einrichten ist möglicherweise etwas aufwendig, aber solange ITS DNS auf dem neuesten Stand ist, sind Sie in Ordnung.

Was passieren wird ist:

  1. Der alte Webserver ist als Reverse Proxy konfiguriert
  2. DNS-Umschaltung
  3. Der neue Webserver liefert Treffer von aktuellen DNS-Einträgen
  4. Altes Web, wenn es einen Treffer erhält, leitet die Anfrage an das richtige DNS weiter und gibt den Inhalt dann wörtlich aus.

Wenn Sie Apache ausführen, schauen Sie in mod_proxy nach. Wenn Sie IIS ausführen, schauen Sie in ISAPI Rewrite nach, um diese Art von Funktionalität zu erhalten.

(Beachten Sie, dass der DNS auf dem alten Webserver auf dem neuesten Stand sein muss, wenn Sie einen Proxy mit dem Domänennamen verwenden möchten. Andernfalls stellen Sie ihn direkt an die IP-Adresse weiter und stellen Sie sicher, dass der Host die IP ohne Hostnamen überwacht.)

Mark Henderson
quelle
1
Um sicherzustellen, dass der alte Webserver auf dem neuen DNS aktualisiert wird. Fügen Sie den Datensatz zu / etc / hosts hinzu.
Matthew Scragg
@MatthewScragg Können Sie dazu weitere Informationen geben? Schritte und Ergebnisse ..
Birla
1
@Birla Auf dem alten Webserver hinzufügen zu /etc/hosts 123.456.789.12 my.domain.comDies wird Ihrem alten Webserver nur die aktualisierte Adresse mitteilen . Wenn ein Client auf den alten Webserver zugreift (da er kein aktualisiertes DNS hat), kann der Webserver die Anforderung unter Verwendung des Domänennamens als Proxy verwenden. Ich benutze Apache nicht, aber hier ist ein Nginx-Beispiel: gist.github.com/scragg0x/738f144b33d17ef763d1
Matthew Scragg
11

Meine Firma hat dies gerade mit mehreren größeren Websites getan. Das grundlegende Verfahren, das wir befolgten, war:

  1. Verringern Sie die TTL der Domain so weit wie möglich. Tun Sie dies im Voraus mindestens so lange wie die aktuelle TTL.
  2. Richten Sie die Website auf dem neuen Server genau so ein, wie Sie das "Endprodukt" haben möchten
  3. Fügen Sie der Site auf dem neuen Server einen Aliasnamen hinzu, z. B. www2.domain.com oder www-new.domain.com. Mit Apache würden Sie die ServerAlias- Direktive verwenden. Wenn die Site überhaupt über dynamischen Code verfügt (PHP, mod_perl, RubyOnRails usw.), stellen Sie sicher, dass sich die Site verhält und mit diesem neuen Namen korrekt reagiert.
  4. Richten Sie zur Umstellungszeit eine Umleitung auf dem alten Server ein, die auf den neuen Server verweist
  5. Ändern Sie DNS für www, um zur neuen IP zu gelangen.

Für Apache sollten Sie wahrscheinlich mod_rewrite für die Umleitung verwenden, damit Sie die vom Client angeforderten URIs beibehalten können. Eine einfache Implementierung wäre:

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

Dadurch wird eine vorübergehende 302-Umleitung für www.domain.com/anything zu www-new.domain.com/anything durchgeführt. Sie möchten, dass es nur vorübergehend ist, da Suchmaschinen wahrscheinlich nur www.domain.com und nicht www-new.domain.com indizieren sollen.

Sobald sich die DNS-Änderung für www.domain.com zu Ihrer Zufriedenheit verbreitet hat, können Sie entweder www-new insgesamt sichern oder jeden, der sie verwendet, mit einer anderen Weiterleitung sanft auf www zurücksetzen. Es ist fast der gleiche Prozess wie oben; Richten Sie den alten Server für die Verarbeitung von www-new ein, ändern Sie DNS für www-new so, dass er auf den alten Server verweist, und richten Sie eine Umleitung auf dem alten Server ein, die www-new-Datenverkehr an www sendet:

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

Dieses Mal möchten Sie eine permanente 301-Weiterleitung durchführen, um in Suchmaschinen-Crawlern erneut darauf hinzuweisen, dass www.domain.com die Site ist, die sie indizieren sollen.

James Sneeringer
quelle
4

Ok, basierend auf den Empfehlungen von @Farseeker habe ich die folgende Konfiguration auf dem alten Apache-Server eingerichtet, um Anforderungen an den neuen Server weiterzuleiten:

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

Um sicherzustellen, dass der alte Server die richtige Adresse hat, habe ich einen Eintrag eingegeben in /etc/hosts:

1.2.3.4 domain.com

Ich musste auch den Apache mod_proxyund die mod_proxy_httpModule aktivieren und die Konfiguration neu laden:

a2enmod proxy
a2enmod proxy_http
/etc/init.d/apache force-reload
Tom
quelle
Nett. Wie gehe ich mit beliebigen Subdomains um?
Ekevoo
4

Es ist ein alter Thread, aber vielleicht hilft es jemandem:

Zusätzlich zu den Antworten von Mark Henderson (mod_proxy) ODER James Sneeringer (302.301 Weiterleitung zu neuen Subdomains) könnte beim Verschieben großer Anwendungen noch etwas zur Datenbanksynchronisierung hinzugefügt werden.

Wenn Ihr Webprojekt eine Datenbank (z. B. MySQL) verwendet, stellen Sie vor dem Umschalten des DNS sicher, dass die Anwendungen (z. B. PHP) von beiden Servern eine Verbindung zu derselben Datenbank herstellen. Damit das Lesen und Schreiben an den gleichen Ort geht und Sie sich danach nicht mehr mit verschiedenen DB-Synchronisierungstools befassen müssen.

Dies würde (höchstwahrscheinlich) die Ladezeit auf einem Server beeinflussen, kann jedoch für den Wechselzeitraum akzeptiert werden.

Falls auf den DB-Server von außen nicht zugegriffen werden kann , können Sie auch den mysql_proxy auf dem Webserver einrichten, der Zugriff darauf hat und von externen IPs aus zugänglich ist.

Cephuo
quelle
3

Ich benutze dafür iptables, wenn ich das tun muss; Ein kurzes Stück DNAT / SNAT und all Ihr Verkehr erscheint auf magische Weise wieder dort, wo er sein sollte. Wenn Sie wirklich die Quell-IP-Adressen pflegen müssen, kann ein Reverse-Proxy helfen, indem Sie geeignete Header festlegen. Dies erfordert jedoch viel Aufwand an beiden Enden, um sicherzustellen, dass alles übereinstimmt, sodass ich mir normalerweise keine Sorgen darüber mache für so etwas wie eine Migration, da sie vorübergehend ist und das Verringern von TTLs das meiste davon erledigt.

womble
quelle