Réplication de sessions PHP d'une application distribuée (cluster PHP) par un filesystem NFS

L’objectif de cet article est de montrer comment correctement répliquer des sessions PHP dans une application PHP distribuée entre n noeud.
Pierre LISERONMis à jour le 18 Déc 2013
AXOPEN_Blog_ReplicationSessionsPHP.jpg

Description du problème dun cluster PHP pour la réplication de session

Dans le cas ou vous avez une application PHPLangage de programmation s’exécutant côté serveur et permettant la création dynamique de pages web ou d'APIs. répliquée sur deux ou plus serveurs dun cluster avec en amont un load balancer (NGINX par exemple) qui redistribue la charge de manière uniforme sur les noeuds (serveur, ou VM), vous pouvez avoir des problèmes pour répliquer les sessions PHP.

Le problème est que lorsque vous créé une session en PHP, PHP crée un fichier de la forme sess_**. Ce fichier sert de stockage de session, malheureusement si vous avez plusieurs serveurs, ce fichier nest pas répliqué entre les noeuds du cluster.

Par exemple, lors dun formulaire de connexion si vous stockez dans la session de lutilisation des informations, lors de la réactualisation de la page, il se peut et il est fort probable que votre loadbalancer vous envoi sur un autre noeud ou ne se trouve pas votre session, le traitement ne fonctionne plus car PHP ne retrouve plus les variables de session.

Comment résoudre le problème?

Une solution efficace si votre système nest pas trop chargé est de partager un répertoire entre vos différents noeuds du cluster et ainsi de répliquer les sessions PHP (fichier sess_****).

Nous allons voir comment procéder.

Pré-requis:

Posséder deux noeuds du cluster et un serveur de fichier (une simple machine virtuelle peut faire laffaire).

Lobjectif est de monter un répertoire du serveur de fichier vers les deux noeuds du cluster et de forcer PHP à écrire dans ce répertoire les sessions.

Créer un serveur de fichier pour les sessions PHP (avec NFS)

Le plus simple est de monter un serveur de fichier NFS.

Installer un serveur nfs sur debian se fait avec la commande:

apt-get install nfs-kerner-server

Créer le répertoire ou vont être stocké les sessions:

mkdir /home/session_php/

Ouvrer le fichier /etc/exports

vi /etc/exports

Rajouter une ligne pour activer le partage du répertoire php_session, par exemple comme ceci. Ici nous partageons le répertoire pour tous les serveurs du sous réseau 192.168.100.0/24 (tous les noeuds du cluster)

/home/session_php 192.168.100.0/24(rw,sync,no_all_squash,anonuid=1000,anongid=1000,no_root_squash)

Redemarrer le serveur NFS:

/etc/init.d/nfs-kernel-server restart

Cest tout pour le serveur

Sur chaque noeud du cluster PHP

Créer le répertoire de montage

mkdir /php_session/

Monter le répertoire réseau:

Editer le fichier /etc/fstab

vi /etc/fstab

Rajouter une ligne comme ceci (en changeant ladresse ip par celle de votre serveur de létape 1)

192.168.100.21:/home/session_php /session_php nfs defaults,user,auto,noatime,intr,rw 0 0

Pour monter le fichier fstab vous pouvez effectuer

mount -a

Editer votre fichier php.ini

vi /etc/php5/apache2/php.ini

et rajouter la ligne:

session.save_path = "/session_php/"

Redémarrer votre apache

/etc/init.d/apache restart

Attention, il faut sassurer que lutilisation du apache existe et a les droits décriture sur le serveur de fichier. Par exemple www-data est bien le droit décriture sur le serveur NFS dans le répertoire /home/php_session/. NFS se basant sur le nom des utilisateurs ainsi que leurs GUID, il faut donc vérifer dans /etc/shadow.

Cest tout!

Vous pouvez voir les sessions se créer dans le répertoire /sessions_php/ et être corretement synchronisées entre les différents neouds du cluster.