High-performance WordPress mit WP-FFPC, memcached, nginx und ISPConfig

WP-FFPC (WordPress Fast Full Page Cache) ist ein Full Page Cache für WordPress, das direkt im Arbeitsspeicher cacht (z.B. mit APCu oder memcached). Da nginx mithilfe des integrierten memcached-Plugins direkt von memcached lesen und somit den kompletten PHP-/MySQL-Stack umgehen kann, lassen sich so äußerst geringe Ladezeiten erreichen, die sehr nahe am Optimum liegen.

WP-FFPC läßt sich ganz normal über den in WordPress integrierten Plugin-Manager installieren:

Nach erfolgter Installation muß das Plugin noch aktiviert werden; danach findet man die WP-FFPC-Einstellungen unter Einstellungen > WP-FFPC. Die Standard-Einstellungen sollten in den meisten Fällen passen. Achten sollte man darauf, daß als Backend entweder PHP Memcached oder PHP Memcache ausgewählt ist, je nachdem, welches memcached-Modul in PHP zur Verfügung steht (bei den von Timme Hosting verwendeten PHP-Versionen stehen ausnahmslos beide Module, also PHP Memcached und PHP Memcache, zur Verfügung, daher kann man sich bedenkenlos für eine der beiden Varianten entscheiden).

Hier finden Sie mehr Informationen zu PHP Memcached und PHP Memcache:

Wenn WP-FFPC sich mit memcached verbinden kann, erscheint unter Backend status die Nachricht up & running:

Auf dem Reiter nginx finden Sie eine Beispielkonfiguration für nginx:

Da wir ISPConfig als Control Panel nutzen, benötigen wir nur den folgenden, leicht abgewandelten Teil - diese Konfiguration sorgt dafür, daß die meisten Anfragen aus dem Cache (memcached) bedient werden, es aber einige Ausnahmen gibt, so z.B. für POST-Requests oder GET-Requests mit Argumenten, falls der angefragte Pfad mit /wp- beginnt oder wenn bestimmte Cookies gesetzt sind (wie es z.B. für eingeloggte User der Fall ist).

Die Zeile

memcached_pass 127.0.0.1:11211;

sorgt schlußendlich dafür, daß der Request, wenn er es bis hierhin geschafft hat, vom memcached bedient wird, wodurch die Seite extrem schnell lädt, da der komplette PHP-/MySQL-Stack umgangen wird:

client_max_body_size 100M;

# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

location ~*  \.(jpg|jpeg|png|gif|css|js|ico)$ {
                expires max;
                log_not_found off;
}

location / {
                try_files $uri $uri/ @memcached;
}

# try to get result from memcached
location @memcached {
                default_type text/html;
                set $memcached_key data-$scheme://$host$request_uri;
                set $memcached_request 1;

                # exceptions
                # avoid cache serve of POST requests
                if ($request_method = POST ) {
                        set $memcached_request 0;
                }

                # avoid cache serve of wp-admin-like pages, starting with "wp-"
                if ( $uri ~ "/wp-" ) {
                        set $memcached_request 0;
                }

                # avoid cache serve of any URL with query strings
                if ( $args ) {
                        set $memcached_request 0;
                }


                if ($http_cookie ~* "comment_author_|wordpressuser_|wp-postpass_|wordpress_logged_in_" ) {
                        set $memcached_request 0;
                }

                if ( $memcached_request = 1) {

                        memcached_pass     127.0.0.1:11211;
                        error_page 404 = @rewrites;
                }

                if ( $memcached_request = 0) {
                        rewrite ^ /index.php last;
                }
}

## rewrite rules
location @rewrites {
                add_header X-Cache-Engine "";
                rewrite ^ /index.php last;
}

Diese Konfiguration fügen wir einfach in das Feld nginx Direktiven in ISPConfig ein (auf dem Reiter Optionen bei den Website-Einstellungen der betroffenen Website) und klicken auf Speichern:

Zum Schluß muß nun noch die Zeile

define('WP_CACHE',true);

in der wp-config.php eingetragen werden, z.B. gleich am Anfang:

<?php
/**
 * In dieser Datei werden die Grundeinstellungen für WordPress vorgenommen.
 *
 * Zu diesen Einstellungen gehören: MySQL-Zugangsdaten, Tabellenpräfix,
 * Secret-Keys, Sprache und ABSPATH. Mehr Informationen zur wp-config.php gibt es
 * auf der {@link http://codex.wordpress.org/Editing_wp-config.php wp-config.php editieren}
 * Seite im Codex. Die Informationen für die MySQL-Datenbank bekommst du von deinem Webhoster.
 *
 * Diese Datei wird von der wp-config.php-Erzeugungsroutine verwendet. Sie wird ausgeführt,
 * wenn noch keine wp-config.php (aber eine wp-config-sample.php) vorhanden ist,
 * und die Installationsroutine (/wp-admin/install.php) aufgerufen wird.
 * Man kann aber auch direkt in dieser Datei alle Eingaben vornehmen und sie von
 * wp-config-sample.php in wp-config.php umbenennen und die Installation starten.
 *
 * @package WordPress
 */

define('WP_CACHE',true);

[...]

Nach oben