Spécialité informatique

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