Teil Drei meiner Beitragsreihe: Nginx – Varnish – Apache – WordPress.

Konfiguration von Apache und WordPress als Backend für Varnish

In meinen beiden vorangegangenen WordPress Artikeln hatte ich über die Installation von Nginx und Varnish für WordPress geschrieben. Um das Ganze nun produktiv mit WordPress benutzen zu können, sind im Apache und WordPress-Backend noch ein paar Feinheiten zu konfigurieren.

Die zusätzliche Konfiguration von WordPress hinter einem Reverse-Caching-Proxy ist meiner Meinung nach für folgende Themen zwingend:

  1. Seiten- und Blogpost-Purging
  2. Kommentar und Pingback Funktion (X-Forwarded-For Header)
  3. SSL Redirect des Admin-Bereiches (X-Forwarded-Protokoll Header)
  4. IP-Adressen forwarding von Nginx und Varnish an den Apache

1. SEITEN- UND BLOGPOST-PURGING

Wenn wir in unserem WordPress bestehende Inhalte ändern, dann sollen unsere Besucher diese Änderungen ja auch gleich sehen können. Da anzunehmen ist, dass dieser geänderte Inhalt im Cache – in diesem Falle Varnish-  liegt, muss der geänderte Inhalt aus dem Cache entfernt (gepurget) werden.
Für die Zusammenarbeit zwischen WordPress und Varnish gibt es spezielle Plugins, die diesen Job übernehmen.
Den Installationszahlen nach zu urteilen, ist „Varnish HTTP Purge“ das populärste WordPress – Varnish Plugin.

Hier auf meinem Blog läuft schon seit Langem das „W3TotalCache“ Plugin.  Dort sind alle notwendigen Varnish Funktionen bereits implementiert, so dass der Varnish Cache mit wenigen Klicks im WordPress Backend eingerichtet ist.

2. Kommentar und Pingback Funktionen (X-forwarded-for Header)

Da der Varnish als auch der Apache auf  „Localhost / 127.0.0.1“ laufen, schlagen ohne konfigurierte X-HTTP Header, Kommentare und auch Pingbacks im WordPress Backend immer mit der IP-Adresse 127.0.0.1  auf. Das ist vielleicht nicht immer das was man in einem Webserver-Logfile sehen möchte. Abhilfe kann mittels „X-HTTP Header“ geschaffen werden.

Die Konfiguration der X-HTTP Header muss dabei stringent in allen „Layern“, sprich Nginx, Varnish und im WordPress Backend vorhanden sein.

X-HTTP Header Konfiguration im Nginx (vollständige Konfiguration auf GitHub):

proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

X-HTTP Header Konfiguration im Varnish (vollständige Konfiguration auf GitHub):

if (req.http.x-forwarded-for) {
              set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
} else {
             set req.http.X-Forwarded-For = client.ip;
}

Konfiguration der WordPress wp-config.php
Damit das WordPress Backend die, im Nginx und Varnish gesetzten / durchgeschleiften, X-HTTP Header verarbeiten kann, muss in der wp-config.php folgende Zeile eingefügt werden:

$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];

3. SSL-Redirect des WordPress Admin-Bereiches (X-forwarded-protokoll Header)

Schliesslich müssen wir WordPress noch mitteilen, dass der WordPress-Adminbereich vom Nginx via  SSL ausgeliefert wird.
Dazu, als kurze Rekapitulation, ein Auszug aus der Nginx Konfiguration meines Blogs:

location ~ ^/wp-login.php {
.
.
proxy_set_header        X-Forwarded-Proto https;
.
.
}

Damit WordPress mit der X-Forward Variable etwas anfangen kann, muss auch diese in der wp-config.php bekannt gemacht werden:

if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
       $_SERVER['HTTPS']='on';

4. IP-Adressen Forwarding von Nginx und Varnish an den Apache

Meiner Meinung nach macht es Sinn, auch dem Apache Webserver die durch den Nginx und Varnish zugreifende Quell IP-Adresse bekannt zu machen.
Damit loggt der  im Apache auch etwas anderes als nur 127.0.0.1  🙂

Hierzu benutze ich das Apache-Modul „mod_remoteip“ und eine kleine Änderung im Apache CustomLogFormat.
Um zu prüfen, ob der Apache bereits das mod_remoteip geladen hat genügt ein einfacher Aufruf in der Shell:

# apachectl -M
Loaded Modules:
 remoteip_module (shared)

Auf meinem RootServer habe ich nun jede virtuelle Host Konfiguration mit den folgenden Zeilen ergänzt:

 RemoteIPHeader X-Forwarded-For
 RemoteIPInternalProxy 127.0.0.1

Passend dazu wurd das Combined-Log-Format angepasst. Das geht ganz einfach, indem man in der apache2.conf in der LogFormat Direktive das „%h“ gegen ein „%a“ tauscht:

#LogFormat "%h %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%a %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i"" combined

Diese Änderungen, gefolgt von einem „/etc/init.d/apache2 graceful“, bringen den Apache nun dazu die remote zugreifende IP-Adresse korrekt ins Logfile zu schreiben.

Damit ist die Installation und Konfiguration von „Nginx – Varnish – Apache – WordPress“ abgeschlossen.

Ein kleiner Hinweis in eigener Sache: den vorgesehene Beitrag zum „Varnish Cache anwärmen“ muss ich aus zeitlichen Gründen auf einen späteren Zeitpunkt verschieben.
Da die Webinale in Berlin,  der verdiente Sommerurlaub ansteht, und mein eigenes „Varnish Cache Anwärmscript“ noch nicht fertig ist, wird es sicherlich Mitte August werden ein wenig dauern, bis der Blogpost dazu online gehen kann.