Memcached - Performance Tuning für Webseiten
Memcached ist ein Dienst, der es möglich macht zum Beispiel eine Mediawiki oder eine Wordpress Installation zu cachen, um somit die Performance und die Webseiten Auslieferungszeit zu verbessern. Ich werde hier beschreiben, wie man memcached für Mediawiki und für Wordpress verwenden kann.
Instalation
Unter Debian/Ubuntu Systemen kann Memcached einfach via aptitude installiert werden:
aptitude install memcached php5-memcache
Konfiguration
Die Konfiguration spielt sich in der sehr gut dokumentierten /etc/memcached.conf ab. Die wichtigste EInstellung ist, wieviel Arbeitsspeicher Memcached als Cache nutzen darf.
/etc/memcached.conf
# Start with a cap of 64 megs of memory. It's reasonable, and the daemon default # Note that the daemon will grow to this size, but does not start out holding this much # memory -m 128
Nach der Konfiguration sollte der Dienst neu gestartet werden
/etc/init.d/memcached restart
ein Blick in den netstat sollte folgende Zeilen beinhalten:
netstat -an
tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN udp 0 0 127.0.0.1:11211 0.0.0.0:*
hier ist zu sehen, das memcached standardmäßig auch auf UDP lauscht, will man dies deaktivieren muss man folgende Zeile in der memcached.conf
einfügen:
# Disable UDP -U 0
Konfiguration des Mediawiki
Die Anbindung des Mediawiki geht ganz einfach über die LocalSettings.php
:
$wgMainCacheType = CACHE_MEMCACHED;
$wgParserCacheType = CACHE_MEMCACHED; # optional
$wgMessageCacheType = CACHE_MEMCACHED; # optional
$wgMemCachedServers = array( "127.0.0.1:11211" );
$wgSessionsInMemcached = true; # optional
Konfiguration des Wordpress
Wordpress kann unterstützt nicht, wie das Mediawiki, die Memcached Anbindung von sich aus. Dafür muss das Plugin FlexiCache nachinstalliert werden. Also einfach im Wordpress einloggen und unter Plugins installieren nach FlexiCache suchen und es installieren und aktivieren. Danach wird es unter "Einstellungen --> FlexiCache" konfiguriert:
- Main Options: Enable caching = Yes
- Main Options: Storage engine = Memcache
Fertig!
Memcache Statistik
Hat man Memcache am Laufen, will man natürlich auch wissen wie effektiv das ganze ist und wieviel des eingerichteten Speichers verwendet wird. Hiefür hat Ron Yayli ein kleines PHP Skript geschrieben, das hier zum Download bereitsteht:
Das Skript kann einfach in den Webserver Root gelegt werden. Dannach sollte man es erstmalig editieren und die Variablen oben im Skript anpassen:
memcache.php
define('ADMIN_USERNAME','admin'); // Admin Username
define('ADMIN_PASSWORD','yourpassword'); // Admin Password
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50);
$MEMCACHE_SERVERS[] = 'localhost:11211'; // add more as an array
//$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array
Ich habe, da ich eh eine Digest Auth vor dem gesamten vhost habe, den eingebauten Passwortschutz deaktiviert:
/*if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ||
$_SERVER['PHP_AUTH_USER'] != ADMIN_USERNAME ||$_SERVER['PHP_AUTH_PW'] != ADMIN_PASSWORD) {
Header("WWW-Authenticate: Basic realm=\"Memcache Login\"");
Header("HTTP/1.0 401 Unauthorized");
echo <<<EOB
<html><body>
<h1>Rejected!</h1>
<big>Wrong Username or Password!</big>
</body></html>
EOB;
exit;
}
*/
Testen
Will man wissen ob memcached seinen Job macht, kann man ganz einfach eine Abfrage an ihn schicken:
echo stats | nc 127.0.0.1 11211
oder am Docker Container
docker exec -t CONTAINERNAME /bin/sh -c "/bin/echo stats | /usr/bin/nc 127.0.0.1 11211"
Die Ausgabe sollte dann so aussehen:
STAT pid 1 STAT uptime 9132 STAT time 1579460560 STAT version 1.5.20 STAT libevent 2.1.10-stable STAT pointer_size 64 STAT rusage_user 2.846882 STAT rusage_system 11.130412 STAT max_connections 1024 STAT curr_connections 3 STAT total_connections 925 STAT rejected_connections 0 STAT connection_structures 8 STAT reserved_fds 20 STAT cmd_get 30187 STAT cmd_set 1870 STAT cmd_flush 0 STAT cmd_touch 137 STAT cmd_meta 0 STAT get_hits 27262 STAT get_misses 2925 STAT get_expired 137 STAT get_flushed 0 ...