Apache : Déplacer l’emplacement des sessions PHP
Sommaire
I. Présentation
Nous allons voir dans cet article comment déplacer l'emplacement des sessions PHP dans un environnement Apache. Pour rappel, les sessions permettent de garder des informations pratiques côté serveur.
Lors de l'initialisation d'une session, le visiteur reçoit un cookie avec comme nom "PHPSESSID" et comme valeur une valeur aléatoire et unique.
Côté serveur, ce numéro aléatoire est assigné à une session particulière (celle du visiteur) et le tout permet de stocker des informations sur l'utilisateur. Cela peut par exemple être son pseudo, pour afficher un amical "Bonjour $_SESSION['pseudo']" sur toutes les pages.
Après ce petit rappel, voyons comment sont stockées les sessions dans Apache par défaut.
II. Stockage des sessions dans Apache
Par défaut, les sessions sont stockées dans le répertoire /var/lib/php5.
Pour vérifier cela, rien de plus simple. Nous allons dans notre répertoire web créer un fichier "index.php" qui va se charger de créer une session et d'y stocker deux ou trois valeurs. Nous verrons alors la session se créer
Dans le répertoire web, par défaut il s'agit de /var/www, créez un fichier nommé "index.php", donnez-lui les droits requis pour qu'il soit lu et exécuté par Apache :
chown www-data:www-data /var/www/index.php
Puis mettez ce contenu à l'intérieur :
<?php session_start(); $_SESSION['pseudo']="John"; $_SESSION['age']='24'; echo "Création d'une session"; ?>
Pour décrire rapidement ce que cela fait, il s'agit d'initialiser une session, puis d'y stocker quelques valeurs comme le pseudo et l'âge du visiteur que nous aurions pu récupérer précédemment.
On lance une fois cette page, puis on se rend dans /var/lib/php5 :
On voit donc dans le dossier /var/lib/php5, un fichier contenant un numéro de session, le numéro de votre session créée sera certainement différent chez vous. Si l'on regarde à l'intérieur, on voit les différentes valeurs assignées.
Si on regarde du côté de notre client, et plus précisément dans les cookies, nous pourrons trouver un cookie avec la valeur "PHPSESSID" :
Si vous êtes attentifs, on remarque que le contenu du cookie "PHPSESSID" est le même que le nom de la session côté serveur. Logique !
On voit donc bien que notre session s'est positionnée dans le répertoire par défaut /var/lib/php5 sur notre serveur.
III. Modifier le répertoire des sessions PHP
Nous allons maintenant voir comment changer cet emplacement par défaut des sessions créées.
Mais au fait, pourquoi vouloir changer l'emplacement des fichiers de sessions sur un serveur ?
Cela est rarement obligatoire, cependant, c'est pratique lorsque l'on possède plusieurs vhost (sites web différents) sur notre serveur Apache, cela permet en effet de distinguer les sessions de chaque vhosts et de les séparer. Aussi, pour des raisons d'architecture et de configuration interne, il peut être intéressant de mettre les fichiers de session dans d'autres répertoires ou disques, par exemple sur des disques plus performants que ceux dédiés aux systèmes.
Il faut savoir que cette configuration dépend entièrement de PHP. C'est en effet dans la configuration PHP que l'on peut déterminer où stocker les fichiers de session. Nous allons donc voir comment effectuer cette configuration via la configuration PHP, mais aussi via la configuration Apache, cela pour avoir une configuration spécifique à chaque vhost.
Avant toute chose, il faut savoir où vous souhaitez stocker vos fichiers de session pour créer les dossiers adéquats.
A. Configuration via PHP du dossier session
Sous Debian, la configuration de PHP se trouve dans le fichier /etc/php5/apache2/php5.ini
Dans ce fichier, il faut trouver la valeur "session.save_path" et décommenter cette valeur pour enfin y mettre le nom du nouveau dossier où stocker les fichiers de sessions :
session.save_path = "/mon/nouveau/dossier"
Dès lors, et si votre répertoire est bien créé, les sessions se positionneront dans le nouveau dossier spécifié. Attention, cette configuration s'appliquera à tous les vhosts d'Apache. Si vous souhaitez avoir un emplacement différent pour chaque vhost, c'est dans le point suivant que l'on pourra voir cette configuration.
B. Configuration via Apache du dossier session
Pour avoir un répertoire différent pour chaque vhost, il faut aller spécifier cela dans la configuration de chaque vhost. On doit spécifier où doivent être disposés les fichiers de session avec la ligne suivante :
php_admin_value session.save_path "/var/www/mon_vhost/sessions"
Pour être plus clair, un vhost est généralement composé de plusieurs sections, voici où positionner cette ligne de configuration dans ces sections :
<VirtualHost> .... <Directory ...> ... php_admin_value session.save_path "/var/www/mon_vhost/sessions" .... </Directory> </VirtualHost>
À nouveau, il faut bien sûr que le répertoire en question soit créé.
Pour que les modifications faites sur les vhosts soient appliquées, il faut recharger la configuration d'Apache. Afin d'éviter toute erreur, je vous conseille dans un premier temps de vérifier la configuration d'Apache avec la commande suivante :
apachectl configtest
Si la commande vous répond "Syntax OK". Vous pourrez recharger la configuration d'Apache avec la commande suivante :
service apache2 reload
Et voilà, les nouvelles sessions de ce vhost se créeront maintenant dans le nouveau répertoire spécifier. Les autres vhost eux, continueront à utiliser la configuration mise dans PHP. Si vous voulez que tous les vhosts aient un répertoire de stockage des fichiers de session différent, il faut effectuer cette configuration pour chacun d'entre eux.
C. Suppression automatique des sessions
Il y a une chose qui est souvent omise lorsque l'on applique les configurations précédentes. Plus précisément, il faut savoir que les sessions sont régulièrement supprimées par un processus interne du système mis en place par PHP. Si vous êtes un curieux sur le fonctionnement d'Apache, vous remarquerez dans le fichier /etc/cron.d/php5 la ligne de commande suivante :
09,39 * * * * root [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete
Il s'agit donc d'une commande exécutée deux fois par heure, une fois à la neuvième minute et une fois à la trente-neuvième minute, son rôle est de supprimer toutes les sessions créées il y a plus de "maxlifetime", qui est la valeur définissant la durée de vie d'une session. Vous remarquerez que, par deux fois, on peut voir dans cette ligne de commande le répertoire par défaut de l'emplacement des sessions. Si l'on change l'emplacement où sont créées les sessions, ce script n'aura plus effet, et vous vous retrouverez rapidement avec un nombre très important de fichiers de sessions dont la plupart sont inutiles, car trop vieux.
Il faut donc, dans ce même fichier crontab /etc/cron.d/php5, modifier l'emplacement de ce répertoire. Plus techniquement, il s'agit de remplacer /var/lib/php5 par le chemin du nouveau répertoire.
Note : Si vous disposez de plusieurs répertoires (un par vhost comme vue dans la partie B), il faut copier cette ligne de commande pour en avoir une par vhost.
Et voilà ! Nous avons fait le tour de ce qui doit être fait pour changer proprement l'emplacement des sessions PHP dans Apache2. Notez qu'une fois cette configuration faite, il ne faut pas oublier de supprimer les sessions qui ne seront plus utilisées dans le répertoire par défaut /var/lib/php5 !
Salut ,
Je suis tout à fait d’accord avec toi !