Serverumzug fast ohne Unterbrechung: postfix, mysql, apache

Da die Wartung von meinem Server-Betriebsystem diesen Monat ausgelaufen ist, war ich dazu gezwungen einen neuen Server einzurichten und die Webseiten umzuziehen.

Ich habe diese Tatsache genutzt, um auch gleich in ein neueres Server-Paket zu wechseln – mehr Leistung weniger Kosten. Leider müssen die Domains jetzt extra bezahlt werden. Aber was soll’s.

Da ich möglichst wenig offline-Zeit haben wollte, habe ich mir einige Informationen zusammen gesucht und wollte Euch (und mir – wenn man es mal wieder machen muss) mein Vorgehen dazu dokumentieren.

Vorbereitung

Zuerst habe ich bei mysql alle User exportiert – dazu habe ich nach einer Inspiration von dieser Beschreibung: Migrate / Move MySQL Database And Users To New Server folgendes Script genutzt – einfach weil ich nicht alle Datenbanken auf einmal verschieben wollte sondern eben nach und nach.

Export der User der Datenbank mit Rechten zu den Datenbanken:

#!/bin/bash
read -s -p "mysql Passwort für root: " passwort
mysql -u "root" -p"$passwort" -B -N \
-e "SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') AS query FROM user" \
mysql \
| mysql  -u "root" -p"$passwort" \
|  sed 's/Grants for .*/#### &/'

Die Ausgabe des Scriptes kann man dann als Input auf dem neuen Server an mysql senden. Zuvor habe ich die Datei aber noch manuell bearbeitet und root, sowie alle User die evtl. nicht mehr benötigt werden, rausgeschmissen. Root gibt es ja bei der neuen Datenbank schon. Dann habe ich noch die hostnamen geprüft und ggf. angepasst – was kaum nötig war, da die User eigentlich nur grant-Rechte für @localhost haben – denn die DB ist auch nur lokal auf dem Server ansprechbar.

Ihr die Datei sieht dann pro DB-User in etwas so aus:

#### Grants for username@localhost
GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY PASSWORD '*xxxxxxxxxxxxxxxxxxxxxx'
GRANT ALL PRIVILEGES ON `DBNAME`.* TO 'username'@'localhost'

Einlesen auf dem Neuen Server kann man sie dann mit:

mysql -u root -p < datei.sql

datei.sql ist die von Euch angepasste/geprüfte export-Datei von Server 1.

Dann noch die Datenbanken anlegen – dazu alle, wie eben schon die User, auslesen:

#!/bin/bash
read -s -p "mysql Passwort für root: " passwort
mysql -u "root" -p"$passwort" -B -N \
-e "show databases" \
mysql \
| while read db; do mysql -u "root" -p"$passwort" -B -N -e "show create database $db;";done \
| sed 's/.*\(CREATE\)/\1/'

Man bekommt dann eine Ausgabe die in etwa so aussieht:

CREATE DATABASE `dbname` /*!40100 DEFAULT CHARACTER SET latin1 */

Diese kann man dann auf dem neuen Server genauso einlesen. Vorher wieder prüfen ob nicht zu viel drin steht – die DBs wie mysql, information_schema sollten nicht übernommen werden, da diese auch schon von mysql angelegt werden. Am besten vorher auf dem neuen Server gucken, was es schon gibt und die dann aus der Liste rausschmeißen.

Jetzt hat man ein leeres Gerüst an Datenbanken mit den richtigen Berechtigungen für die Benutzer wie auf dem alten Server.

Hier jetzt noch ein Script um die einzelnen Datenbanken zu exportieren – den brauchen wir aber erst, wenn wir die Datenbanken umziehen:

read -sp "root passwort: " pass
mysqldump -u root -p$pass --quote-names --opt $1

Auf dem alten Server für den Apache die Proxy-Module aktivieren: mod_proxy und mod_proxy_http und in der proxy.conf diese Zeilen prüfen und ggf. anpassen:

ProxyRequests Off

ProxyPreserveHost On

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

ProxyVia On

Umzug einer Seite

  • Apache config auf dem neuen Server unter /etc/apache2/sites-available/ wie gewohnt anlegen.
  • Auf dem alten Server das DocumentRoot-Verzeichnis packen – habe ich mit:
    tar cvpWf ordner.tar ordner

    gemacht. Damit werden die Datei-Rechte übernommen und das Archiv am Ende noch geprüft.

  • Datei auf den neuen Server kopieren und auspacken:
    tar xvf ordner.tar
  • mit a2ensite die Apache-Konfig aktivieren und ein apache2 reload machen.
  • auf dem alten Server in die vhost-konfig folgendes einfügen:
    ProxyPass / http://ip-des-neuen-servers/
    ProxyPassReverse / http://ip-des-neuen-servers/
    SetOutputFilter INFLATE;DEFLATE
  • Falls es für die Webseite eine Datenbank gibt diese noch aus dem dump importieren.

Damit sollte jetzt alles auf der alten Domain an den neuen Server umgeleitet werden. Am besten ein Blick in die Logs auf beiden Servern werfen oder auch vorher mit einer Dummy-Testseite testen. Wenn alles läuft kann man nach und nach alle Domains auf die Art umziehen. eine DNS-Änderung ist damit noch nicht nötig.

Konfiguration postfix für eine Weiterleitung

Nun eine Weiterleitung für Mail einrichten….

Unter /etc/postfix/main.cf folgende Zeilen hinzufügen:

#### Weiterleitung auf den neuen Server
transport_maps = hash:/etc/postfix/transport
relay_domains = domain1.de domain2.de etc....

Bei “relay_domains” tragt ihr alle Domains ein, die nicht unter “mydestination” stehen aber vom Server empfangen und weitergeleitet werden sollen. Bei mir war das nötig für die zuvor unter “virtual_alias_domains” hinterlegten Domains. Wenn man da keine hatte, sondern eh alles unter “mydestination” stand ist die Zeile überflüssig.

Jetzt muss noch die transport Datei angelegt werden, wenn ihr alle Domains auf den neuen Server weiterleiten wollt (er muss diese auch schon annehmen, also unter “mydestination” hinterlegt sein) geht das wie folgt:

hostname-alter-server	:
*				relay:[hostname-neuer-server]

Damit nimmt der Server nur noch die Mails an, die für ihn selber sind alles andere leitet er an den neuen Server weiter. Also alle Domains werden weitergeleitet – der technische Hostname den man bei den meisten Providern bekommt – wird lokal zugestellt.

Sollen nur einzelne Domains weitergeleitet werden, könnt ihr sie auch explizit angeben:

domain1.de	relay:[hostname-neuer-server]
.domain1.de	relay:[hostname-neuer-server]

domain2.de	relay:[hostname-neuer-server]
.domain2.de	relay:[hostname-neuer-server]

hostname-neuer-server ist immer die komplette Adresse also, auf die auch die IP aufgelöst wird bzw. unter der er sich auch meldet “myhostname”, in der postfix-config.

Wenn wir jetzt postfix neu starten, sollten alle Mails vom alten Server angenommen und gleich an den neuen weitergeleitet werden. Wieder Logs prüfen. Da sollten solche Einträge vorkommen wie:

Apr 28 16:09:29 alter_host_name postfix/smtp[13825]: EAC5421F00B6: to=<>, relay=host_name_neuer_server[IP-NeuerServer]:25, delay=0.89, delays=0.47/0.07/0.12/0.23, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as AB5C81770123)

Abschluss

Wenn das alles läuft, kann man anfangen die Domains auf dem DNS umzuziehen.

Immer wieder die Logs prüfen, ob alles läuft… der Apache und Postfix dürfen auf dem alten Server noch nicht abgeschaltet werden!

Nach 2-3 Tagen wenn die DNS-Änderung weltweit bekannt ist, kann man mal die Logs prüfen ob noch Anfragen die eigentlich an den neuen Server gehen sollten am Alten aufschlagen. Wenn dem nicht mehr so ist, kann man nun Apache und Postfix auf dem alten Server abschalten und ist fertig. :-)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert