Stockage des sessions PHP dans memcached

Posted by

Contexte :

Sans configuration particulière, les sesions PHP sont stockées dans un répertoire local sur le système de fichiers du serveur.
Cependant, dans le cas d’une infrastructure web composée de plusieurs serveurs derrière un load balancer, si l’utilisateur se trouve aiguillé sur un second serveur, il perd alors sa session.
Pour assurer une continuité du service, on peut utiliser un système de fichiers partagé ou un système en mémoire comme Memcached.

Memcached:

On installe le service sur chacun des frontaux web :

root@www1:~# apt -y install memcached
root@www1:~# systemctl enable memcached

On configure memcache pour à minima écouter sur le réseau et naturellement il faudra redémarrer memcached après cela :

root@www1:~# cat /etc/memcached.conf
-d
logfile /var/log/memcached.log
-m 64
-p 11211
-u memcache
-l 0.0.0.0
-P /var/run/memcached/memcached.pid

PHP :

Côté PHP, on aura besoin de l’extension correspondant à la version de PHP installée.
PHP fourni deux extensions, -memcache et -memcached, plus récente. C’est bien la première que nous voulons.
Exemple :

root@www1:~# apt -y install php8.1-memcache

Ensuite, côté PHP, il faut indiquer memcache comme session handler dans le fichier php.ini.
Côté Debian, celui-ci est géré par version et par type de module (cli,mod apache, ou php-fpm) dans le répertoire /etc/php/version/install_type.

Chaque serveur memcache doit être indiqué car il faut se rappeler que les différents serveurs memcache n’opèrent pas comme un vrai cluster.

session.save_handler = memcache
session.save_path = 'tcp://192.168.10.1:11211,tcp://192.168.10.2'

Enfin on va indiquer dans la configuration du module memcache (conf.d/20-memcache.ini sous Debian/Ubuntu) le mode de stockage des clés :

memcache.allow_failover=1
memcache.session_redundancy=3
memcache.hash_strategy=consistent

Le nombre de session_redundancy doit être égal au nombre de serveurs memcache + 1.

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *