Comment partager des sessions PHP sur plusieurs serveurs Memcached sur Ubuntu 14.04

introduction

Memcached est un système de mise en cache d’objets distribués qui stocke des informations en mémoire plutôt que sur disque pour un accès plus rapide. Le module PHP Memcache peut être utilisé pour gérer des sessions qui seraient autrement stockées sur le système de fichiers. Stocker des sessions PHP dans Memcached présente l’avantage de pouvoir les distribuer sur plusieurs serveurs de cloud exécutant Memcached, de manière à maintenir la redondance des sessions.

Sans cette configuration Memcached, si votre application est en train d’être équilibrée sur plusieurs serveurs, il serait nécessaire de configurer le maintien de la session sur l’équilibreur de charge. Cela préserve l’expérience des utilisateurs et les empêche d’être déconnectés subitement. La configuration de Memcached pour gérer les sessions garantira que tous les serveurs cloud du pool Memcached disposent du même ensemble de données de session, ce qui vous évite de devoir rester en contact avec un serveur pour préserver la session.

Conditions préalables

Ce tutoriel suppose que vous maîtrisiez initialiser LAMP serveurs dans Ubuntu. + Cette configuration utilisera 3 Droplets avec l’image * Ubuntu 14.04 *.

  • Goutte 1 *

  • Nom: lamp01

  • IP publique: 1.1.1.1

  • IP privée: 10.1.1.1

  • Goutte 2 *

  • Nom: lamp02

  • IP publique: 2.2.2.2

  • IP privée: 10.2.2.2

  • Goutte 3 *

  • Nom: lamp03

  • IP publique: 3.3.3.3

  • IP privée: 10.3.3.3

Assurez-vous que la case Private Networking est cochée lors de la création des gouttelettes. Notez également les adresses IP privées, car nous en aurons besoin ultérieurement.

Installez LAMP sur les trois serveurs.

Tout d’abord, mettez à jour le référentiel et installez Apache.

apt-get update
apt-get install apache2

Installez PHP et l’extension mod_php d’Apache.

apt-get install php5 libapache2-mod-php5 php5-mcrypt

Pour plus d’informations, voir cet article.

Première étape - Installer les paquets Memcache

Sur * lamp01 *, installez le démon Memcached et le module PHP Memcache.

apt-get install php5-memcache memcached

PHP a deux paquets: php5-memcache et php5-memcached (notez le «d» à la fin). Nous allons utiliser le premier paquet (memcache) car il est plus léger sans aucune dépendance. Lisez la comparaison entre memcache et memcached.

Le service Memcached n’écoute que sur localhost (127.0.0.1). Cela doit être changé pour accepter les connexions du réseau privé.

nano /etc/memcached.conf

Trouvez la ligne suivante:

-l 127.0.0.1

Changez-le pour écouter sur l’adresse IP privée de ce serveur.

-l

Redémarrez le service + memcached +.

service memcached restart

Répétez ces étapes sur les deux autres serveurs en remplaçant "+ 127.0.0.1 +" par l’adresse IP privée appropriée.

  • lampe02 *

-l
  • lampe03 *

-l

Redémarrez le service + memcached + sur les deux autres serveurs.

Deuxième étape - Définir Memcached en tant que gestionnaire de session PHP

Sur * lamp01 *, ouvrez le fichier + php.ini pour le modifier.

nano /etc/php5/apache2/php.ini

Ce fichier se trouve dans + / etc / php5 / fpm / php.ini + sur les installations PHP-FPM.

Recherchez les directives de configuration suivantes:

session.save_handler =
session.save_path =

Modifiez-les pour utiliser Memcache comme suit. Utilisez les trois adresses IP privées dans le dossier + session.save_path +.

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

Vous devrez peut-être supprimer le commentaire + session.save_path + en supprimant le point-virgule au début. N’oubliez pas de saisir le numéro de port * 11211 * après chaque adresse IP, car Memcached l’écoute sur ce port.

Ajoutez exactement les mêmes paramètres sur les deux autres serveurs.

Sur * lamp02 *:

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

Sur * lamp03 *:

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

Cette configuration doit être exactement la même sur toutes les Droplets pour que le partage de session fonctionne correctement.

Troisième étape - Configurer Memcache pour la redondance de session

Sur * lamp01 *, éditez le fichier + memcache.ini +.

nano /etc/php5/mods-available/memcache.ini

Ajoutez les directives de configuration suivantes à la fin de ce fichier.

memcache.allow_failover=1
memcache.session_redundancy=4

La directive + memcache.session_redundancy + doit être égale au nombre de serveurs memcached + 1 pour que les informations de session soient répliquées sur tous les serveurs. Ceci est dû à un bug en PHP.

Ces directives permettent le basculement et la redondance de session. PHP écrit donc les informations de la session sur tous les serveurs spécifiés dans + session.save_path +; semblable à une configuration RAID-1.

Redémarrez le serveur Web ou le démon FPM PHP en fonction de ce qui est utilisé.

service apache2 reload

Répétez ces étapes exactement sur * lamp02 * et * lamp03 *.

Quatrième étape - Redondance des sessions de test

Pour tester cette configuration, créez le script PHP suivant sur toutes les droplets.

<?php
   header('Content-Type: text/plain');
   session_start();
   if(!isset($_SESSION['visit']))
   {
       echo "This is the first time you're visiting this server\n";
       $_SESSION['visit'] = 0;
   }
   else
           echo "Your number of visits: ".$_SESSION['visit'] . "\n";

   $_SESSION['visit']++;

   echo "Server IP: ".$_SERVER['SERVER_ADDR'] . "\n";
   echo "Client IP: ".$_SERVER['REMOTE_ADDR'] . "\n";
   print_r($_COOKIE);
?>

Ce script est uniquement destiné aux tests et peut être supprimé une fois les droplets configurés.

Accédez à ce fichier sur le premier Droplet à l’aide de curl et extrayez les informations du cookie.

curl -v -s http:///session.php 2>&1 | grep 'Set-Cookie:'

Cela retournera une sortie similaire à la suivante.

< Set-Cookie: PHPSESSID=8lebte2dnqegtp1q3v9pau08k4; path=/

Copiez le cookie + PHPSESSID + et envoyez la demande aux autres droplets utilisant ce cookie. Cette session sera supprimée par PHP si aucune demande n’est faite pendant 1440 secondes. Assurez-vous donc de terminer le test dans les délais impartis. En savoir plus sur session.gc-maxlifetime pour en savoir plus à ce sujet.

curl --cookie "" http:///session.php http:///session.php http:///session.php

Vous constaterez que la session est en cours sur toutes les gouttelettes.

Your number of visits: 1
Server IP: 1.1.1.1
Client IP: 117.193.121.130
Array
(
   [PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4
)
Your number of visits: 2
Server IP: 2.2.2.2
Client IP: 117.193.121.130
Array
(
   [PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4
)
Your number of visits: 3
Server IP: 3.3.3.3
Client IP: 117.193.121.130
Array
(
   [PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4
)

Pour tester le basculement, arrêtez le service + memcached + et accédez-y à ce fichier.

service memcached stop

La droplet utilise de manière transparente les informations de session stockées sur les deux autres serveurs.

curl --cookie "" http:///session.php

Sortie:

Your number of visits: 4
Server IP: 1.1.1.1
Client IP: 117.193.121.130
Array
(
   [PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4
)

Désormais, un équilibreur de charge peut être configuré pour répartir les demandes de manière uniforme, sans avoir à configurer la rigidité de la session.

Redémarrez + memcached + une fois que vous avez terminé les tests:

service memcached start

Cinquième étape - Memcached sécurisé avec IPTables

Même si Memcached utilise le réseau privé, d’autres utilisateurs de DigitalOcean dans le même centre de données peuvent se connecter à votre Droplet s’ils connaissent votre adresse IP privée. Nous allons donc https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04 pour la configuration des règles IPTables] afin d’autoriser uniquement les serveurs cloud de notre pool Memcached pour communiquer entre eux.

Nous effectuons cette étape après avoir testé la redondance de session afin de faciliter la résolution des problèmes pouvant survenir si des règles incorrectes étaient appliquées.

Créez des règles de pare-feu sur * lamp01 * avec les adresses IP privées de * lamp02 * et * lamp03 *.

iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT

Sur un serveur LAMP typique, l’ensemble complet de règles est le suivant:

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
iptables -P INPUT DROP

Entrez les règles de pare-feu sur * lamp02 * avec les adresses IP privées de * lamp01 * et * lamp03 *.

iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT

Faites la même chose sur * lamp03 * avec les adresses IP privées de * lamp01 * et * lamp02 *.

iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT

Répétez les tests de * l’étape 4 * pour confirmer que le pare-feu ne bloque pas notre trafic.