WordPress-Mediathek auf Subdomain auslagen. Warum und wie ein eigenes CDN bauen.

Die Performance gehört zu den wichtigsten Faktoren wenn es um die technische Optimierung einer Website geht. User erwarten schnelle Seiten und auch Google rankt Sites mit hoher Performance im Index weiter nach vorne. Es lohnt sich also hier zu optimieren.
Um zu prüfen welche Bereiche eurer Website verbesserungswürdig sind, könnt ihr beispielsweise Google Page SpeedGTmetrix, Pingdom, PageSpeed.info, KeyCDN oder Yahoo YSlow nutzen. Die Dienste empfehlen die Nutzung eines sog. CDN (= Content Delivery Network), also die Auslagerung von Medianinhalten auf verschiedene Server dessen Aufgabe ausschließlich die Verwaltung und Verteilung dieser Inhalte ist. Es muss aber kein echter CDN-Dienst sein. Häufig reicht eine eigene Subdomain.

 

Bessere Website-Performance durch „Load Sharing“

Wenn eine Website im Browser geladen wird, erzeugt jede geladene Datei einen sog. HTTP-Request (Server-Anfrage). Der Browser kann in der Regel zwischen zwei und vier Requests parallel bearbeiten. Je mehr Dateien eure Website laden muss, desto länger wird die Warteschlange der Anfragen und desto länger wird der Seitenaufbau verzögert. Moderne Websites fassen Dateien und Scripte daher in Paketen wie beispielsweise CSS-Sprites zusammen um Requests zu sparen – aber das ist ein anderes Kapitel.

Die Begrenzung der Requests erfolgt pro Domain! Wenn wir Daten auf externe Domains, in unserem Fall eine Subdomain, auslagern, können mehr Serveranfragen parallel bearbeitet werden. Diese Vorgehensweise kann den Seitenaufbau spürbar beschleunigen.
Es wäre also möglich Bilder auf images.domain.de und Scripte auf scripts.domain.deauszulagern. Achtet jedoch darauf, dass ihr nur dann Daten auf eine Subdomain auslagert, wenn die Datenmenge angemessen ist. Die Auflösung der Domain kostet nämlich auch wieder Zeit.

Die optimale Lösung wäre der Einsatz eines echten Content Delivery Network (kurz: CDN). Hierbei werden die Daten auf verschiedene physikalische Server ausgelagert. Häufig werden auch verschiedene Standorte für die Server berücksichtigt um Inhalte für den Besucher optimal ausliefern zu können. Diese Methode ist jedoch technisch sehr aufwändig und kostenintensiv. Ein CDN lohnt sich daher meist erst für richtig große Websites.

 

Kurz und knapp. Was haben wir vor?

Damit ihr wisst was euch erwartet, fasse ich einmal kurz zusammen was getan werden muss um die Mediathek erfolgreich auszulagern.

Zunächst wird natürlich eine Subdomain benötigt. Wenn bereits Inhalte in die „alte“ Mediathek hochgeladen wurden, müssen diese nun auf die Subdomain verschoben werden. Dafür ist ein Update der Datenbank notwendig damit die Dateizuordnungen nicht verloren gehen. Anschließend wird innerhalb von WordPress als Upload-Verzeichnis die Subdomain eingerichtet. Von nun an werden auch neue Inhalte automatisch auf die Subdomain hochgeladen. Zuletzt sollte die Google Bildsuche nicht vernachlässigt werden.

Nicht vergessen! Datenbank-Backup erstellen, Serverbackup erstellen.

 

 

Subdomain einrichten, Pfad ermitteln

Als erstes braucht ihr natürlich eine Subdomain. Wie ihr eine Subdomain einrichtet ist abhängig von eurem Provider. Bei 1und1, Strato und HostEurope könnt ihr Subdomains unkompliziert über das Kunden-Administrationsinterface einrichten. Solltet ihr nicht wissen wie eine Subdomain einzurichten ist, wendet euch bitte an den entsprechenden Provider.
Sobald die Subdomain aktiv ist, müsst ihr den Serverpfad ermitteln. Diesen Pfad benötigen wir später um in WordPress angeben zu können wo die Daten hochgeladen werden sollen.
Erstellt eine Datei mit folgendem Inhalt und speichert sie unter dir.php ab.

<? echo dirname(__FILE__); ?>

Ladet die Datei nun auf die Subdomain hoch und ruft sie im Browser auf (http://subdomain.deine-domain.de/dir.php). Ihr seht nun den Pfad zu der Datei. Er sollte in etwa so aussehen:

/is/htdocs/12784521_GGTZAIUHSDN/www/subdomain.deine-domain.de

Notiert euch den Pfad und löscht die Datei wieder vom Server!

Daten der Mediathek umziehen

Nun verschieben oder kopieren wir die Mediathek an Ihren neuen Ort. Die Mediathek findet ihr auf dem Server unter ../wp-content/uploads/.
Wenn ihr die Möglichkeit habt mit einer Kopie zu arbeiten, tut das. Da Google einige Zeit braucht um zu merken, dass die Bilder umgezogen sind vermeidet ihr mit einer Kopie tote Bild-Links in Googles Bildersuche.

Ihr solltet nun also eine unveränderte alte Mediathek besitzen und eine Kopie des Orders uploads auf der Subdomain erstellt haben.

Datenbank aktualisieren

Nun geht es an die Datenbank. Wenn ihr mit einer Kopie der Mediathek arbeitet, sieht eure Website noch aus wie immer. Wenn ihr die Mediathek verschoben habt, sind alle Inhalte der Mediathek jetzt verschwunden. Wir müssen also die Pfade in der Datenbank auf den neuen Standort der Mediathek aktualisieren. Dafür gibt es verschiedene Methoden.

In der Regel werdet ihr die Datenbanken über phpMyAdmin verwalten. Noch einmal zur Erinnerung: erstellt ein Backup eurer funktionierenden Datenbank, damit ihr im Notfall alles wieder herstellen könnt.

Möglichkeit 1: MySQL-Befehl in phpMyAdmin absetzen

Ihr könnt die Pfade in der Datenbank über folgenden SQL-Befehl direkt in phpMyAdmin anpassen. Achtet darauf, dass die Tabellen der Datenbank, sowie der alte und der neue Domainname stimmen.


UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://deine-domain.de/wp-content/uploads/', 'http://subdomain.deine-domain.de/');

Möglichkeit 2: Datenbank exportieren, Pfade ersetzen, Datenbank importieren

Alternativ könnt ihr über phpMyAdmin auch zunächst die Datenbank exportieren. Anschließend öffnet ihr die *.sql-Datei mit einem Texteditor und ersetzt den alten Pfad (bsp: http://deine-domain.de/wp-content/uploads/) mit dem neuen Speicherort der Mediathek (bsp: http://subdomain.deine-domain.de/).
Anschließend importiert ihr die Datenbank wieder.

Wenn ihr eure Seite nun im Browser aufruft sollte alles funktionieren. Ihr könnt im Quellcode einmal nachschauen ob die Medieninhalte korrekt auf die Subdomain verweisen.

Einstellungen im WordPress-Backend

Jetzt müssen wir WordPress noch mitteilen, dass neu hinzugefügt Medieninhalte auch in die neue Mediathek geladen werden. Dazu ruft ihr im WordPress-Dashboard den Punkt „Einstellungen → Mediathek“ auf.

Im unteren Bereich seht ihr den Abschnitt „Dateien hochladen“. Tragt in das obere Feld den anfangs ermittelten Serverpfad ein. In das untere Feld gehört der komplette Pfad zu den Dateien.

Speichert die Einstellungen und ladet ein Testbild in die Mediathek hoch um zu prüfen ob das Bild auch an den richtigen Ort geladen wird. Wenn alles funktioniert seid ihr mit dem Umzug der Mediathek fertig.

 

Geänderte Einstellungen seit WordPress 3.5

Seit WordPress 3.5 sind die o.g. Eingabefelder verschwunden. Ihr könnt die Upload-Felder mit Hilfe des Plugins WP Original Media Path wiederherstellen.

Das erwähnte Plugin bietet konkret zwei Möglichkeiten:

  1. Eingabefeld „Uploads in folgendem Ordner speichern“; d.h. der Speicherpfad kann nach Belieben festgelegt werden.
  2. Eingabefeld „Kompletter Pfad zu den Dateien“; wobei das auch eine Subdomain wie z.B. media.meinedomain.de sein kann. Die Dateien werden dann über media.meinedomain.de/yyyy/mm/mein-dateiname.png ausgeliefert, statt per meinedomain.de/wp-content/uploads/yyyy/mm/mein-dateiname.png.

Google informieren

Je nachdem wie viele Bilder eure Website beinhaltet stellt die Google Bildersuche eine nicht zu vernachlässigende Besucherquelle dar. Google benötigt einige Zeit um zu merken dass die Bilder umgezogen sind. Daher haben wir die Mediathek zunächst auch kopiert und nicht verschoben. Besucher gelangen über Google also solange auf das „alte“ Bild bis Google den Pfad aktualisiert hat.
Damit Google alle Pfade aktualisiert, solltet ihr mit einem Redirect 301 per .htaccessnachhelfen.


redirect 301 /wp-content/uploads
http://subdomain.deine-domain.de

Laut Martin dauert es ca. eine Woche bis Google merkt, dass die Bilder umgezogen sind. Ihr müsst also einfach ein paar Stichproben in der Bildsuche machen. Sobald Google alle Pfade geändert hat, könnt ihr die alte Mediathek löschen.