WordPress rasend schnell mit APC, memcached und weiteren Optimierungen

veröffentlicht am 21. Juni 2011

In den letzten Wochen ging es gefühlt bergab mit der Geschwindigkeit meines Blogs. Deshalb habe ich gestern mal wieder etwas Hand an mein WordPress gelegt, alles mögliche optimiert und neue Caches ausgetestet. Ich muss sagen, dass ich mit dem Ergebnis mehr als zufrieden bin.

Alternative PHP Cache

Zunächst habe ich den Alternative PHP Cache (APC) installiert. Da PHP eine interpretierte Sprache ist, muss ein PHP-Script vor der Ausführung erst kompiliert werden. APC cached das Kompilat, sodass beim nächsten Aufruf des Scripts das Kompilieren entfällt. Unter Ubuntu installiert und aktiviert man APC ganz einfach wie folgt:

aptitude install php-apc
/etc/init.d/apache2 restart

Nach dem Neustart des Webservers ist APC automatisch aktiviert – es ist keine weitere Konfiguration erforderlich (es sei denn, man will noch das letzte Quäntchen heraus holen).

memcached

Als nächstes habe ich memcached installiert. Mit memcached können Daten im Arbeitsspeicher gehalten werden. Zwar gibt es das entsprechende PHP-Modul für memcached in den Paketquellen von Ubuntu, aber aus unerklärlichen Gründen konnte das benötigte Plugin FlexiCache für WordPress nichts mit der PHP-Erweiterung aus den Paketquellen anfangen. Also habe ich das Modul wie folgt manuell installiert. Im gleichen Abwasch werden noch der memcached-Server sowie die SQLite-Unterstützung für PHP installiert (mehr dazu gleich):

aptitude install php-pear php5-dev memcached php5-sqlite
pear install memcache
echo "extension=memcache.so" >> /etc/php/apache2/php.ini
/etc/init.d/apache2 restart

Nachdem alle benötigten Pakete installiert wurden, muss das Plugin FlexiCache für WordPress installiert werden. Nach der Aktivierung des Plugins sind kleinere Einstellungen zu machen, wobei die Grundeinstellungen bereits sehr gut sind.

In den Main Options von FlexiCache aktiviert ihr zunächst einmal den Cache, stellt als Storage Engine memcached ein und erhöht ggf. noch die Ablaufzeit des Caches:

Des Weiteren habe ich den Standalone Mode von FlexiCache aktiviert. Hierbei werden Anfragen über eine entsprechende Umleitung direkt an FlexiCache gerichtet. Sollte ein gültiger Cache-Eintrag vorhanden sein, wird dieser direkt ausgeliefert, ohne das eine Zeile WordPress-Code ausgeführt wird. Sollte kein passender Cache-Eintrag vorhanden sein, übergibt FlexiCache die weitere Behandlung an WordPress und cached die Seite dann natürlich.

Die entsprechende Modifikation für eure .htaccess-Datei kann bequem über den Punkt Standalone Mode aktiviert werden, sofern die Datei über entsprechende Zugriffsrechte verfügt. Ansonsten werden euch die Anpassungen auch angezeigt und müssen per Hand in die .htaccess-Datei eingefügt werden.

Die vorhin installierte SQLite-Unterstützung für PHP wird übrigens automatisch von FlexiCache für interne Zwecke verwendet. Es erleichtert FlexiCache, veraltete Cache-Einträge zu identifizieren und diese dann zu löschen. Solltet ihr keine SQLite-Unterstützung installiert haben, wird sich dies aber laut Dokumentation des Plugins nicht negativ auf die Ladezeit auswirken.

.htaccess raus, VirtualHost rein

Über die vielfach verwendete .htaccess-Datei kann bequem das Verhalten des Webservers beeinflusst werden: Umleitungen einrichten, HTTP-Header versenden, Authentifizierung einrichten – alles kein Problem. Der Nachteil ist jedoch, dass die Datei bei jeder einzelnen Anfrage vom Webserver ausgewertet wird. Sollte also zum Beispiel eine Seite drei JavaScripts, zwei CSS-Dateien und fünf bilder einbinden, seit ihr im Besten fall mit 11 Anfragen dabei und somit muss die .htaccess-Datei 11x ausgewertet werden.

Besser ist es, die Inhalte aus der .htaccess-Datei direkt in die Konfiguration des Webservers zu übernehmen. Dort wird die Konfiguration einmal beim Start des Webservers eingelesen und muss nicht mehr erneut ausgewertet werden.

Die VirtualHost-Konfiguration für diese Domain habe ich dazu wie folgt angepasst:

<VirtualHost *:80>
	<Directory /var/www/www.patrick-gotthard.de>
		// hier die Inhalte aus der .htaccess-Datei
	</Directory>
</VirtualHost>

Natürlich handelt es sich hierbei nicht um die komplette Konfiguration des VirtualHosts, sondern nur um die Inhalte, die nötig sind, um das Übertragen der .htaccess-Einträge in die Konfiguration zu beschreiben. Der Verzeichnispfad muss absolut angegeben werden und entspricht dem Speicherort auf dem Server.

GravatarCache einrichten

Die meisten Blogs verwenden Gravatare, um vor allem die Kommentare etwas persönlicher zu gestaltet. Der Nachteil besteht darin, dass die Gravatar-Server nicht unbedingt sie schnellsten sind. Deshalb habe ich den GravatarCache von Sergej eingerichtet.

Google Web Fonts auf den eigenen Webserver packen

Zwar war die Webseite nach diesen Anpassungen schon sehr schnell, ein Blick auf die Ladezeiten mit Firebug zeigte jedoch, dass die meiste Ladezeit damit verbracht wird, die vom Theme verwendeten Google Web Fonts herunterzuladen. GoogleCDN hin oder her, die Ladezeiten stimmten einfach nicht. Deshalb habe ich die Fonts einfach auf meinen eigenen Server gepackt und das Stylesheet entsprechend angepasst.

Hierzu muss zunächst im Stylesheet der entsprechende @import für die Google Web Fonts gesucht werden. Die angegebene URL wird dann einfach im Browser geöffnet. Bei mir war diese URL eingetragen: http://fonts.googleapis.com/css?family=Droid+Sans:regular,bold|Droid+Serif:regular,italic,bold,bolditalic&subset=latin

Das @import habe ich dann durch die entsprechende Ausgabe ersetzt. Der Abschnitt enthält diverse URLs, über welche die Google Web Fonts referenziert werden. Einfach die URLs aufrufen, .woff-Dateien herunterladen und auf dem eigenen Server ablegen. Danach müssen die URLs noch an den eigenen Server angepasst werden und fertig.

Weitere Optimierungen

Neben den vorgestellten Optimierungen können noch diverse Tricks umgesetzt werden. So sollte man sich zum Beispiel einmal den Apache Caching Guide durchlesen. Dass die Anzahl der installierten Plugins die WordPress-Performace beeinträchtigt und die Datenbank gepflegt werden sollte, muss ich wohl nicht großartig erwähnen.

Kommentare

Sehr schön, wobei ich gesehen habe, dass Gravatar Cache noch nicht greift bzw. fehlerhafte Bilder zu sehen sind.

Kommentar #1 von Sergej Müller am 21. Juni 2011


Auweh, vorhin hat es noch geklappt und die Kommentare werden mit dem Cache auch noch nicht korrekt angezeigt… da muss ich wohl nochmal feintunen.

Kommentar #2 von Patrick am 21. Juni 2011


Hi Patrick, hast du auch Performance-Messungen gemacht? Wär nützlich als Richtlinie, welche Maßnahme wieviel bringt. Muss mir da beizeiten auch mal Gedanken machen, WordPress lahmt ja gerne ein wenig rum. Hab aber (nicht leider!) lighttpd als Webserver laufen, werd daher deine Tipps so nicht umsetzen können. hm. da gibts aber bestimmt auch was.

Kommentar #3 von Jan am 21. Juni 2011


Ich hatte auch mal eine Zeit lang lighttpd am Laufen, aber die Konfiguration von Apache ist einfach im Web viel besser dokumentiert und verbreitet.

Ich konnte die Ladezeit von mehreren Sekunden auf unter eine drücken, habe nun aber nicht jede Maßnahme einzeln gebenchmarked. Am meisten haben memcached und die Verlagerung der Google Web Fonts gebracht.

Kommentar #4 von Patrick am 21. Juni 2011


So oben hatte sich ein kleiner Fehler eingeschlichen. Beim Übertragen der .htaccess muss natürlich Directory statt Location genommen werden – mit Location funktionieren nicht alle Angaben aus der .htaccess.

Werden die Kommentare nun sofort aktualisiert und werden die Gravatare korrekt angezeigt?

Kommentar #5 von Patrick am 21. Juni 2011


Mit FlexiCache und memcache hab ich mich noch gar nicht beschäftigt. Bisher setze ich WP Super Cache und APC ein. Wie viel RAM muss ich denn bei memcache einplanen?

Kommentar #6 von Timo am 21. Juni 2011


Unterscheidet google Fonts nicht anhand des browsertyps welches Font-Format es ausliefert? Dieses verhalten wäre mit dem eigenen Hosting natürlich hin.

Kommentar #7 von Chris am 21. Juni 2011


@Timo: Bei FlexiCache sind derzeit 64MB Maximum eingestellt.
@Chris: Hmm gute Frage… müsste man mal testen und im Zweifelsfall erweitern.

Ich merke gerade, dass die Kommentare nicht aktualisiert werden bei FlexiCache… da muss ich auch nochmal ein wenig forschen.

Kommentar #8 von Patrick am 21. Juni 2011


Wäre vielleicht auch W3 Total Cache eine Alternative zu FlexiCache? Unterstützt ja ebenfalls memcache.

Kommentar #9 von Timo am 21. Juni 2011


Ach nun verstehe ich, warum sich keiner über nicht auftauchenden Kommentare beschwert. Der Cache wird nicht ausgeliefert, sobald das Cookie für’s Kommentieren gesetzt ist :D

W3 Total Cache hatte ich schonmal im Einsatz. Gefällt mir nicht so gut, ist recht groß und liefert die Seiten bei weitem nicht so schnell aus, wie FlexiCache + memcached.

Kommentar #10 von Patrick am 21. Juni 2011


Ja wie, ja was? Ist „rasend schnell“ jetzt eine Zahl? Steht da eine, hab ich die überlesen?

Wobei ich durchaus weiß, das man das wohl nicht so genau sagen kann wie: 2 + 2 = 4. Aber kannst du bei deiner Erfahrung damit nicht mal mit dem „dicken Daumen“ was einschätzen?

Bringt das 10%, 50%, ist das 2x, 3x so schnell? Mit anderen Worten: lohnt sich dein Aufwand für dich?

Kommentar #11 von JürgenHugo am 21. Juni 2011


Also vor der Umsetzung betrug die Ladezeit bei mir zwischen 3 bis 5 Sekunden. Jetzt liege ich in meinen Tests in der Regel unter einer Sekunde. Es lohnt sich also. Wer surft nicht gerne auf schnellen Webseiten ohne Wartezeiten (sofern der Inhalt stimmt)? :)

Kommentar #12 von Patrick am 21. Juni 2011


@Sergej: wie konntest du vorhin so schnell den Artikel tweeten? Der Artikel war nicht einmal im Feedburner sichtbar und somit auch noch nicht getwittert worden. Hast du dir ein Plugin gestrickt, das automatisch bei einem Pingback oder Trackback den entsprechenden Artikel twittert?

Kommentar #13 von Patrick am 21. Juni 2011


Ansich ne feine Sache, aber ich musste gerade erst den Cache vom Feuerfuchs deaktivieren um festzustellen, dass es hier Kommentare gibt. :D
btw. das da weiter oben hört sich für den Laien eher nach böhmischen Dörfern an.

Kommentar #14 von Christian am 21. Juni 2011


Ja, ja – Inhalt sollte schon sein – bei allem optimieren. Da liegt eher meine Stärke. Fürs Optimieren gibt das nette Menschen, die man nett fragen kann.

Da hat jeder was davon: der „Optimierer“ kann sich schön schlau fühlen – der „Optimierte“ kann sich schön bedanken. Das ist immer ein geben und nehmen.

Kommentar #15 von JürgenHugo am 21. Juni 2011


das sind schöne tips – ob die einsparungen den aufwand lohnen, sollten testreihen zeigen. schade, dass so einige sachen nur greifen, wenn ein eigener webserver bzw. zugriff auf denselben zur verfügung steht, vieles läuft ja dann doch noch über shared hosting.
beim punkt mit den google fonts bin ich mir nicht sicher, ob die selbst gehostet werden dürfen?! und im prinzip ist der einwurf eines kommentierers hier richtig. die ausgabe der fontdatei müsste natürlich browserangepasst laufen.

trotzdem, danke für den flexichache tip. werde mir das mal gleich ansehen.

Kommentar #16 von Lars Mielke am 22. Juni 2011


Hallo, ein sehr schöner Artikel, auch wenn ich immer noch an memcache verzweifle.

Hat zufällig wer eine Ahnung, warum Felxicache mir sagt, dass memcache nicht auf meinem Server installiert sei, obwohl es das zu 100% ist? Braucht WordPress noch irgend welche zusätzlichen Informationen, um mit memcache etwas anfangen zu können? Für einen Denkanstoß in die richtige Richtung wäre ich sehr dankbar!

Kommentar #17 von Steven am 25. Juni 2011


Hast du memcached wie oben installiert, de Webserver neugestartet und nachgeschaut, was PHP sagt (die Funktion phpinfo() ist hier sehr hilfreich)?

Könnte auch sein, dass die php.ini bei dir woanders liegt als oben beschrieben.

Kommentar #18 von Patrick am 25. Juni 2011


DAS nenn ich mal Perfomance :D.

Kommentar #19 von Niljuha am 26. Juni 2011


Pingback #20 von Linkhub – Woche 25-2011 | PehBehBeh am 26. Juni 2011


Die Tipps sind super,du solltest öfter solche Tutorials erstellen. Ich, persönlich, muss noch manche Dinge beim mem cache überprüfen bevor ich mit der Installierung beginne. Danke, trotzdem

Kommentar #21 von Martin am 27. Juni 2011



Klasse Tipps, bin auch gerade dabei diese umzusetzen. Habe auf meinen Unterseiten auch arg mit der Ladezeit zu kämpfen. Habe schon einige Sachen ausprobiert, aber diese hier sind doch mal wieder ganz neu für mich. Gibt gleich mal ein google+ dafür. Auch sonst sehr gute Inhalte auf Deinem Blog.

Kommentar #23 von Falko am 24. Februar 2012


Hallo Patrick,

danke für die Tipps und den Artikel.

Ich kenne mich mit ServerKonfiguartion etc. nicht so gut aus, daher verzeihe mir die Frage:

Kannst Du Dir erklären warum Alternative PHP Cache meinen Blog langsamer macht? Ich habe bzw. nutze immer noch Disc Enhanced (Einstellung unter W3 Total Cache für Page Cache). Ich habe eigentlich gedacht das APC schneller ist?!

Sobald ich APC aktiviere, dann habe ich 1-2 Sekunden (Domain-)Wartezeit bis das Rendern/Laden der Seite beginnt. (lt. Pingdom)

Im übrigen hat kein Cahce Plugin anährend die Ladezeiten/Perfomance auch nur im Ansatz gebracht wie W3 Total Cache (Flexi Cache muß ich aber gestehen habe ich nicht ausprobiert)

Kommentar #24 von Christian am 16. Oktober 2012


Hallo Christian,

eventuell ist der Arbeitsspeicher deines Servers bereits ausgereizt und APC muss bei einem Request erst einmal Platz schaffen – das führt dann zu Performance Einbrüchen. Ist aber nur eine Vermutung, die Probleme können auch eine ganz andere Ursache haben.

Gruß
Patrick

Kommentar #25 von Patrick am 16. Oktober 2012


Hallo Patrick,
obwohl der Artikel schon älter ist, bin ich auf ihn gestoßen und finde ihn hochinteressant.

Unsere Seite ist leider durch die admin-ajax.php (woocommerce) sehr langsam.

Hast du vielleicht eine Idee, das ganze zu optimieren?

Danke!

Kommentar #26 von Konstantin am 23. Juni 2015


Hinterlasse einen Kommentar