Serverübergreifende PHP Sessions mit memcache
Im letzten Artikel habe ich ein minimalistisches Active/Active Clustersetup aufgebaut. Ein Problem hierbei, wenn mal der eine, mal der andere Server eine Anfrage beantwortet klappt das mit vielen PHP-Anwendungen nicht, da die ihre Session-Informationen standardmäßig im Dateisystem ablegen. Somit stehen die Sessions immer nur einem der Cluster-Nodes zur Verfügung. Abhilfe schafft hier memcached
bzw. php5-memcache
.
Die Installation wird wie folgt gestartet:
apt-get install memcached php5-memcache
Anschließend müssen in der php.ini
die folgenden Zeilen angepasst werden:
session.save_handler = memcache
session.save_path = ‘tcp://node1:11211,tcp://node2:11211’
Außerdem muss die Datei /etc/php5/mods-available/memcache.ini
mit folgenden Werten versehen werden:
; uncomment the next line to enable the module
extension=memcache.so
[memcache]
memcache.dbpath=”/var/lib/memcache”
memcache.maxreclevel=0
memcache.maxfiles=0
memcache.archivememlim=0
memcache.maxfilesize=0
memcache.maxratio=0
memcache.allow_failover=1
memcache.session_redundancy=3
Der Wert memcache.session_redundancy
muss aufgrund eines PHP-Bugs immer n+1
sein, wobei n
die Anzahl der tatsächlichen Server ist.
In der Datei /etc/memcached.conf
sollten jetzt noch IP (-l
) und Port (-p
) geprüft und ggf. angepasst werden.
Abschließend wird der Apache neu gestartet. Die ganze Aktion muss natürlich auf allen Nodes wiederholt werden. Lohn der Mühe: Sessions werden jetzt statt im Dateisystem in Memcache abgelegt und stehen so serverübergreifend zur Verfügung.