Amazon Web Services : Monter une instance EC2 via NFS
Ce document me sert de mémo pour monter une instance EC2 en NFS vers une autre instance.
Intérêt et applications pratiques des AWS
Amazon propose depuis quelques années déjà des services de cloud computing. Dans le cadre d'une clusterisation d'application web sous PHP, la gestion des sessions peut rapidement
devenir problématique.
Pour remédier à la gestion des sessions PHP, plusieurs solutions existent :
- Déport de Session
- Utilisation de memcache
- Utilisation de Unisson
- Stockage de sessions dans SGBD
- ...
Pré-requis
- Une instance EC2 avec Apache et PHP
- Une instance pour recevoir les sessions
En cas de difficulté, consulter mes précédents tutos.
Opérations côté serveur de sessions - LE SERVEUR NFS
Dans le groupe de sécurité utilisé par le serveur, ouvrir les ports suivants :
- TCP: 111, 2049
- UDP: 111, 32806
Relancer l'instance une fois les modifs effectuées dans la console AWS/EC2.
Connexion en SSH sur l'instance prévue pour recevoir les sessions
sudo ssh -i /fichier_credential.pem ec2-user@ec2-xxx-sessions.amazonaws.com
Création d'un répertoire de stockage des sessions
sudo mkdir /home/sessions
sudo chown ec2-user /home/sessions
sudo chgrp ec2-user /home/sessions
sudo chmod 777 /home/sessions
sudo yum install nfs-utils rpcbind
Placer dans le fichier /etc/exports le répertoire cible et l'url INTERNE de l'instance client
sudo vi /etc/exports
/home/sessions ip-10-xxxx.xxx.xxxx.compute.internal(rw,async)
Faire prendre en compte le changement. Cette commande est à utiliser à chaque modification du fichier exports.
sudo exportfs -ar
sudo service rpcbind start
Starting rpcbind: [ OK ]
sudo service nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS daemon: [ OK ]
Starting NFS mountd: [ OK ]
Starting RPC idmapd: [ OK ]
sudo service nfslock start
Starting NFS statd: [ OK ]
Opérations côté serveur Apache-PHP - LE CLIENT NFS
Connexion en SSH sur l'instance hébergeant les services PHP
sudo ssh -i /fichier_credential.pem ec2-user@ec2-xxx-php.amazonaws.com
Démarrer les services (les installer au besoin).
sudo yum install nfs-utils rpcbind
sudo service rpcbind start
Starting rpcbind: [ OK ]
sudo service nfslock start
Starting NFS statd: [ OK ]
sudo chkconfig --level 2345 rpcbind on
sudo chkconfig --level 2345 nfslock on
Montage du répertoire de sessions PHP vers le serveur (ici encore url INTERNE !!)
sudo mount -t nfs ip-10-xxx.xxx.XXX.compute.internal:/home/sessions /var/lib/php/session
sudo vi /home/site/phpinfo.php
session_start();
echo 'Démarrage de session';
phpinfo();
Exécuter le fichier php avec le session_start().
Vérifier la présence de la session sur le serveur de sessions.
Le garbage collector de PHP n'est pas actif avec un lecteur mappé... Pas de chance...
Il faut donc nous faire un GC sur le serveur de session sous une forme de tâche planifiée. Le php.ini nous donne suffisamment d'informations pour avoir une config opérationnelle.
; NOTE: If you are using the subdirectory option for storing session files
(see session.save_path above), then garbage collection does *not*
happen automatically. You will need to do your own garbage
collection through a shell script, cron entry, or some other method.
For example, the following script would is the equivalent of
setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
cd /path/to/sessions; find -cmin +24 | xargs rm
cd /home/sessions/; find -cmin +1 | rm -f