WordPress Multisites mit Nginx und mehreren Domains

Von Der Alex am 10. Januar 2014

Update:

In meiner Konfiguration hat sich leider ein kleiner Fehlerteufel eingeschlichen, weshalb für die Sub-Blogs in der WordPress Multisite Installation die Permalinks nicht funktionieren. Dadurch werden alle Permalinks von foo.de auf blog.bar.com geleitet.

Folgende Änderungen sind nötig:

  • Die Datei multisite.conf muss angepasst werden.
  • In der wp-config.php muss die Anweisung define(‚SUBDOMAIN_INSTALL‘, false); auf define(‚SUBDOMAIN_INSTALL‘, true); geändert werden.

Ich habe den Artikel an den entsprechenden Stellen angepasst.

Vielen Dank noch mal an Sascha R. für die tatkräftige Unterstützung. Wenn wir uns mal wieder treffen, dann gebe ich dir ein Bier aus 🙂

Vorwort

Nachdem ich nun längere Zeit nichts von mir habe hören lassen, hier die offizielle Entschuldigung:

Ich bin Vater geworden 😀

Aber langsam ist Routine in das neue Familienleben eingekehrt und somit auch mehr Zeit für neue Artikel vorhanden. Also wollen wir gleich mit einem schwierigen Thema anfangen.

 Ziel

Wir wollen WordPress als Multisite Installation auf einem Nginx Webserver zum Laufen bekommen und für jeden Multisite Blog eine separate Domain nutzen.

Vorgaben

Zuerst ein paar Vorgaben:

Wir haben 2 Domains und eine Subdomain:

  • foo.de
  • bar.com
  • blog.bar.com

Wir haben einen Server mit der IP 127.0.0.1

Wir haben einen nginx Webserver, php-fastcgi und ein MySql DBMS installiert (so viel setze ich jetzt mal voraus). Um der anfänglichen Verwirrung noch die Krone aufzusetzen werden wir folgendes tun:

Die Domain bar.com wird zu einer statischen HTML Seite verweisen.

Die Subdomain blog.bar.com verweist auf das WordPress Multisite Netzwerk und zugleich auf den ersten Blog.

Die Domain foo.de verweist auf den zweiten Blog im Multisite Netzwerk.

A-Records für die Domains eintragen

Die Domains die wir haben, müssen zuerst wissen, wohin sie denn verweisen sollen. Hierzu erstellt man am Besten einen A-Record. Das macht man für gewöhnlich über ein Adminpanel der entsprechenden Domainvergabestelle. In unserem Beispiel Verweisen alle Domains auf 127.0.0.1, was unserer Server-IP entspricht.

Verzeichnisstruktur erstellen

Nun erstellen wir eine passende Verzeichnisstruktur. Diese ist später wichtig, wenn wir die verschiedenen Domains nutzen wollen. Ebenso dient es der Übersicht.

Wir haben 3 Domains aber nur 2 Verzeichnisse. Warum? Das erklärt sich später. 🙂

cd /var/www
mkdir bar.com
mkdir blog.bar.com

Im Verzeichnis bar.com erstellen wir nun vorerst eine einfache HTML Seite (index.html), die uns das Feedback gibt, dass bar.com auf das richtige Verzeichnis verweist.

<!DOCTYPE html>
<html>
	<head>
		<title>bar.com</title>
		<meta charset="utf-8">
	</head>
	<body>
		<p>Wir sind in /var/www/bar.com</p>
	</body>
</html>

In das Verzeichnis /var/www/blog.bar.com wird die WordPress Installation kopiert. Um WordPress für Multisites nutzbar zu machen, muss man noch die Datei wp-config.php anpassen. Diese liegt in /var/www/blog.bar.com/wp-config.php. Sucht nach folgendem Eintrag:

 

define('WP_DEBUG', false);

Darunter tragt ihr nun folgendes ein:

/**
 * Multisite Installation
 */
define('WP_ALLOW_MULTISITE', true);

Somit ist WordPress für Multisite vorbereitet. Im Dashboard findet man nun unter Werkzeuge den Unterpunkt Netzwerk einrichten. Dort kann man dann die Multisite Installation aktivieren.

Da wir Nginx als Webserver nutzen, wird uns hier vorgegeben, das Multisite Netzwerk in Form von Verzeichnissen zu nutzen. Das machen wir natürlich vorerst. 🙂

Danach werden wir gebeten noch mal die Datei wp-config.php zu bearbeiten. Unseren letzten Eintrag erweitern wir also wie folgt:

/**
 * Insallation
 */
define('WP_ALLOW_MULTISITE', true);
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', true);
define('DOMAIN_CURRENT_SITE', 'blog.bar.com');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);

Wichtig ist, dass wir hier define(‚SUBDOMAIN_INSTALL‘, true); eingestellt haben, da wir die Domains als vhosts laufen lassen.

Das ist aber noch nicht alles. Nun sollen wir auch noch die .htaccess Datei bearbeiten. Das ist aber nicht möglich, denn da wir Nginx nutzen, gibt es dort keine .htaccess Dateien mehr.

Das macht aber nichts. Nginx trägt die so genannten Rewrite-Rules direkt in entsprechende Konfigurationsdateien ein.

Nginx Konfiguration

Die Bitte von WordPress, die .htaccess Datei anzupassen ignorieren wir also vorerst. Dafür kümmen wir uns um die generelle Konfiguration von Nginx für unsere Domains.

Der Übersicht halber (und weil sich das eben so etabliert hat) erstellen wir in paar Konfigurationsdateien, die wir bei Bedarf an benötigter Stelle einbinden können. Dazu erstellen wir im Nginx Konfigurationsverzeichnis ein Unterverzeichnis /global.

cd /etc/nginx
mkdir global

Dort erstellen wir zuerst eine allgemeingültige Konfigurationsdatei defaults.conf

# Allgemeine Config.
listen 80;
index index index.php index.html index.htm;
# favicon wird nicht geloggt
location = /favicon.ico {
    log_not_found off;
    access_log off;
}
# robots.txt
location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}
# 404 Pages konfigurieren
error_page 404 /404.html;
# 50x Pages konfigurieren
error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/www;
    }
# Hidden Files absichern
location ~ /\. {
    deny all;
}
# Expire Headers für diverse Dateien erzeugen.
location ~* ^.+\.(js|css|swf|xml|txt|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
    access_log off; log_not_found off; expires 30d;
}

Als nächstes erstellen wir eine WordPress Konfigurationsdatei wordpress.conf

# Rewrite Rules, für schöne Permalinks in WordPress
location / {
    try_files $uri $uri/ /index.php?q=$uri&$args;
}

# PHP Dateien sind im Upload Verzeichnis verboten!
location ~* /(?:uploads|files)/.*\.php$ {
    deny all;
}
# PHP FastCgi aktivieren
location ~ \.php$ {
    # Zeroday Exploit Protection
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi_params;
}

Hier haben wir dann auch schon unsere erste Rewrite Rule um Permalinks unter Nginx nutzen zu können. Nun erstellen wir noch eine weitere Konfigurationsdatei für Multisites. Diese nennen wir passenderweise multisite.conf.

rewrite /wp-admin$ $scheme://$host$uri/ permanent;

Hier haben wir dann auch die weiteren Rewrite Rules für unsere WordPress Multisite.

Aus Virtual Hosts werden Server Blocks

Nun geht es an die Konfiguration der einzelnen Domains. Was für viele apache Nutzer als Vhost oder virtual host bekannt sein dürfte, wird bei nginx Server Blocks genannt. Die Nutzung läuft genauso, wie bei apache auch. Wir haben die Verzeichnisse sites-available und sites-enabled. Die Konfigurationsdateien erstellen wir in sites-available und verlinken sie in sites-enabled. Beginnen wir mit der Konfigurationsdatei für die Domain bar.com. Die Datei nennen wir ebenfalls bar.com.

server {
	server_name bar.com www.bar.com;
	include	global/defaults.conf;
	index index index.php index.html index.htm;

	location / {
		root /var/www/bar.com;
		try_files $uri $uri/ /index.php?$args ;
	}
}

Hier wird die defaults.conf eingebunden um allgemeingültige Parameter zu laden. Im Location Kontext findet man das root-Verzeichnis für die Domain, welches wir selbst angelegt haben. Weiter geht es mit blog.bar.com

server {
    server_name blog.bar.com;
    index index index.php index.html index.htm;
    root /var/www/blog.bar.com;
    access_log /var/log/nginx/blog.bar.com.access.log;
    error_log /var/log/nginx/blog.bar.com.error.log;
    include global/defaults.conf;
    include global/wordpress.conf;
    include global/multisite.conf;
}

Auch hier binden wir wieder einige Dateien ein. Diesmal neben der defaults.conf auch noch alle notwendigen Dateien für die WordPress Multisite Installation. Das root-Verzeichnis ist /var/www/blog.bar.com welches wir selbst angelegt haben. Zudem werden jeweils für access-Logs und error-Logs eigene Dateien erstellt. Nun kommt die Sonderlocke. foo.de

server {
	server_name foo.de www.foo.de;
	index index index.php index.html index.htm;
	root /var/www/blog.bar.com;
	access_log /var/log/nginx/foo.de.access.log;
	error_log /var/log/nginx/foo.de.error.log;
	include global/defaults.conf;
	include global/wordpress.conf;
	include global/multisite.conf;
}

Die Besonderheit ist hier, dass die Domain foo.de ebenfalls auf das Verzeichnis /var/www/blog.bar.com zeigt. WordPress erstellt nämlich keine echten Unterverzeichnisse sondern generiert diese über unsere Rewrite Rules. Ein Verweis auf ein Unterverzeichnis ist daher nicht möglich. Aber auch nicht nötig.

Die Domain auf ein Multisite Blog verweisen

Die Konfiguration um foo.de für einen bestimmten Blog im Multisite Netzwerk zu erstellen, wird entweder im Adminbereich von WordPress oder in der Datenbank vorgenommen. In der Datenbank geht es relativ einfach. WordPress erzeugt im Multisite Modus für jeden Blog eigene Tabellen mit separatem Präfix. Standardmäßig sieht das dann so aus: wp_tabellenname, wp_2_tabellenname, wp_3_tabellenname… Wir möchten die Domain foo.de auf unseren zweiten Blog verweisen. Dazu bearbeiten wir die Tabelle wp_2_options. Dazu müssen die beiden Werte für die Felder home und siteurl angepasst werden:

UPDATE wp_2_options SET option_value = 'http://foo.de' WHERE option_name = 'home';
UPDATE wp_2_options SET option_value = 'http://foo.de' WHERE option_name = 'siteurl';

Das war’s! Nun sollten alle Domains auf die jeweiligen Verzeichnisse verweisen. Wenn der Webserver und PHP Fast-CGI laufen, führen nun alle Domains zu den richtigen Webseiten. 😀

Ein Kommentar

Schreibe einen Kommentar

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