Comment configurer un serveur Redis en tant que gestionnaire de session pour PHP sous Ubuntu 14.04

introduction

Redis est un système de stockage et de cache clé-valeur open source, également appelé serveur de structure de données pour sa prise en charge avancée de plusieurs types de données, tels que les hachages, les listes, les ensembles et les images bitmap, entre autres. Il prend également en charge la mise en cluster, ce qui le rend souvent utilisé pour des environnements hautement disponibles et évolutifs.

Dans ce didacticiel, nous verrons comment installer et configurer un serveur Redis externe afin qu’il soit utilisé comme gestionnaire de session pour une application PHP fonctionnant sous Ubuntu 14.04.

Le gestionnaire de session est responsable du stockage et de la récupération des données enregistrées dans les sessions - par défaut, PHP utilise * fichiers * pour cela. Un gestionnaire de session externe peut être utilisé pour créer scalable environnements PHP derrière un https://www.digitalocean.com/community/ tutoriels / concepts d’introduction à haproxy-et-équilibrage de charge [équilibreur de charge], dans lesquels tous les nœuds d’application se connectent à un serveur central pour partager les informations de session.

Conditions préalables

Nous allons travailler avec deux serveurs distincts dans ce tutoriel. Pour des raisons de sécurité et de performances, il est important que les deux gouttelettes soient situées dans le même centre de données avec https://www.digitalocean.com/community/tutorials/how-to-set-up-and-use-digitalocean-private-networking [ réseau privé] activé. Voici ce dont vous aurez besoin:

  • Un serveur Web PHP exécutant LAMP ou https: //www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04[LEMP] sur Ubuntu 14.04 - nous ferons référence à ce serveur comme * web *

  • Un second serveur propre Ubuntu 14.04 sur lequel Redis sera installé - nous désignerons ce serveur par * redis *

Vous aurez besoin d’un accès SSH approprié aux deux serveurs en tant qu’utilisateur régulier, avec l’autorisation https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04].

Étape 1 - Installez le serveur Redis

La première chose à faire est de mettre le serveur Redis en marche, sur notre * Redis * Droplet.

Nous utiliserons le gestionnaire de paquets Ubuntu habituel avec un référentiel de confiance PPA fourni par Chris Lea. Ceci est nécessaire pour nous assurer que nous obtenons la dernière version stable de Redis.

Tout d’abord, ajoutez le référentiel PPA en exécutant:

sudo add-apt-repository ppa:chris-lea/redis-server

Appuyez sur + ENTER pour confirmer.

Maintenant, vous devez mettre à jour le cache du gestionnaire de paquets:

sudo apt-get update

Et enfin, installons Redis en lançant:

sudo apt-get install redis-server

Redis devrait maintenant être installé sur votre serveur. Pour tester l’installation, essayez cette commande:

redis-cli ping

Cela permettra de se connecter à une instance Redis s’exécutant sur * localhost * sur le port * 6379 *. Vous devriez obtenir un * PONG * comme réponse.

Étape 2 - Configurez Redis pour accepter les connexions externes

Par défaut, Redis n’autorise que les connexions à + ​​localhost +, ce qui signifie que vous ne pourrez accéder que de l’intérieur du serveur sur lequel Redis est installé. Nous devons modifier cette configuration pour autoriser les connexions provenant d’autres serveurs du même réseau privé que le serveur * redis *.

La première chose à faire est de rechercher l’adresse IP du réseau privé de la machine Redis. Les étapes suivantes doivent être exécutées sur le serveur * redis *.

Exécutez + ifconfig + pour obtenir des informations sur vos interfaces réseau:

sudo ifconfig

Vous devriez obtenir un résultat similaire à ceci:

Output    eth0      Link encap:Ethernet  HWaddr 04:01:63:7e:a4:01
             inet addr:188.166.77.33  Bcast:188.166.127.255  Mask:255.255.192.0
             inet6 addr: fe80::601:63ff:fe7e:a401/64 Scope:Link
             UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
             RX packets:3497 errors:0 dropped:0 overruns:0 frame:0
             TX packets:3554 errors:0 dropped:0 overruns:0 carrier:0
             collisions:0 txqueuelen:1000
             RX bytes:4895060 (4.8 MB)  TX bytes:619070 (619.0 KB)

   eth1      Link encap:Ethernet  HWaddr 04:01:63:7e:a4:02
             inet addr:  Bcast:10.133.255.255  Mask:255.255.0.0
             inet6 addr: fe80::601:63ff:fe7e:a402/64 Scope:Link
             UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
             RX packets:8 errors:0 dropped:0 overruns:0 frame:0
             TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
             collisions:0 txqueuelen:1000
             RX bytes:648 (648.0 B)  TX bytes:578 (578.0 B)

Recherchez le + inet_addr + attribué à l’interface * eth1 *. Dans ce cas, il s’agit de «+ 10.133.14.9 +» - il s’agit de l’adresse IP que nous utiliserons plus tard pour se connecter au serveur * redis * à partir du serveur * web *.

A l’aide de votre éditeur de ligne de commande préféré, ouvrez le fichier + / etc / redis / redis.conf + et cherchez la ligne contenant la définition + bind +. Vous devez ajouter votre * adresse IP de réseau privé * à la ligne, comme suit:

sudo vim /etc/redis/redis.conf

/etc/redis/redis.conf

bind localhost

Si vous voyez «+ 127.0.0.1 » au lieu de « localhost +», c’est bien; Il suffit d’ajouter votre adresse IP privée après ce qui existe déjà.

Maintenant, il vous suffit de redémarrer le service Redis pour appliquer les modifications:

sudo service redis-server restart

Avec cette modification, tout serveur du même réseau privé pourra également se connecter à cette instance Redis.

Étape 3 - Définissez un mot de passe pour le serveur Redis

Pour ajouter une couche de sécurité supplémentaire à votre installation Redis, nous vous invitons à définir un mot de passe pour accéder aux données du serveur. Nous allons éditer le même fichier de configuration de l’étape précédente, + / etc / redis / redis.conf +:

sudo vim /etc/redis/redis.conf

Maintenant, décommentez la ligne contenant + requirepass + et définissez un mot de passe fort:

/etc/redis/redis.conf

requirepass

Redémarrez le service Redis pour que les modifications prennent effet:

sudo service redis-server restart

Étape 4 - Tester la connexion et l’authentification Redis

Pour vérifier si toutes vos modifications ont fonctionné comme prévu, connectez-vous au service Redis depuis l’ordinateur * redis *:

redis-cli -h
Output10.133.14.9:6379>

Si vous avez défini un mot de passe et essayez maintenant d’accéder aux données, vous devriez obtenir une erreur AUTH:

keys *
Output(error) NOAUTH Authentication required.

Pour vous authentifier, il vous suffit d’exécuter la commande + AUTH +, en fournissant le même mot de passe que vous avez défini dans le fichier + / etc / redis / redis.conf +:

AUTH yourverycomplexpasswordhere

Vous devriez obtenir un * OK * en réponse. Maintenant si vous courez:

keys *

Le résultat devrait ressembler à ceci:

Output(empty list or set)

Cette sortie signifie simplement que votre serveur Redis est vide, ce qui est exactement ce à quoi nous nous attendions, car le serveur * Web * n’est pas encore configuré pour utiliser ce serveur Redis en tant que gestionnaire de session.

Conservez cette session SSH ouverte et connectée au + redis-cli + pendant que nous effectuons les étapes suivantes - nous reviendrons à l’invite + redis-cli + pour vérifier si les données de la session sont correctement stockées. changements nécessaires sur le serveur * Web *.

Étape 5 - Installer l’extension Redis sur le serveur Web

Les prochaines étapes doivent être exécutées sur le serveur * Web *. Nous devons installer l’extension PHP Redis, sinon PHP ne pourra pas se connecter au serveur Redis.

Commencez par mettre à jour le cache de votre gestionnaire de paquets en lançant:

sudo apt-get update

Puis installez le paquet + php5-redis +:

sudo apt-get install php5-redis

Votre serveur Web devrait maintenant pouvoir se connecter à Redis.

Étape 6 - Définir Redis comme gestionnaire de session par défaut sur le serveur Web

Maintenant, nous devons éditer le fichier + php.ini sur le serveur * web * pour changer le gestionnaire de session par défaut pour PHP. L’emplacement de ce fichier dépendra de votre pile actuelle. Pour une pile * LAMP * sous Ubuntu 14.04, il s’agit généralement de «+ / etc / php5 / apache2 / php.ini». Pour une pile * LEMP * sous Ubuntu 14.04, le chemin est généralement + / etc / php5 / fpm / php.ini +.

Si vous n’êtes pas sûr de l’emplacement de votre fichier + php.ini principal, un moyen simple de le savoir est d’utiliser la fonction` + phpinfo () + . Il suffit de placer le code suivant dans un fichier nommé `+ info.php + dans votre répertoire racine Web:

<?php
phpinfo();

Lorsque vous accédez au script à partir de votre navigateur, recherchez la ligne contenant «Fichier de configuration chargé» et recherchez l’emplacement exact du fichier + php.ini + chargé.

Ouvrez votre fichier + php.ini et recherchez la ligne contenant` + session.save_handler`. La valeur par défaut est + fichiers +. Vous devriez le changer en + redis +.

Sur les environnements * LAMP *:

sudo vim /etc/php5/apache2/php.ini

Sur les environnements * LEMP *:

sudo vim /etc/php5/fpm/php.ini

/etc/php5/fpm/php.ini

session.save_handler = redis

Vous devriez maintenant trouver la ligne contenant + session.save_path +. Décommentez-le et changez la valeur pour qu’il contienne la chaîne de connexion Redis. Le contenu doit suivre ce format, le tout sur une seule ligne: + tcp: // IPADDRESS: PORT? Auth = REDISPASSWORD +

/etc/php5/fpm/php.ini

session.save_path = "tcp://?auth="

Enregistrez le fichier et redémarrez le service * php *.

Sur les environnements * LAMP *:

sudo service apache2 restart

Sur les environnements * LEMP *:

sudo service php5-fpm restart

Étape 7 - Testez la gestion de session Redis

Pour vous assurer que vos sessions sont maintenant gérées par Redis, vous aurez besoin d’un script ou d’une application PHP stockant des informations sur les sessions. Nous allons utiliser un script simple qui implémente un compteur - chaque fois que vous rechargez la page, le nombre imprimé est incrémenté.

Créez un fichier nommé + test.php + sur le serveur * Web * et placez-le dans le dossier racine de votre document:

sudo vim test.php

/usr/share/nginx/html/test.php

<?php
//simple counter to test sessions. should increment on each page reload.
session_start();
$count = isset($_SESSION['count']) ? $_SESSION['count'] : 1;

echo $count;

$_SESSION['count'] = ++$count;

Pointez votre navigateur sur + http: /// test.php + afin d’accéder au script. Il faut incrémenter le nombre chaque fois que vous rechargez la page.

Vous devriez maintenant avoir les informations de session stockées sur le serveur Redis. Pour vérifier, retournez à votre session SSH sur la machine * redis *, où nous nous sommes déjà connectés au service Redis en utilisant + redis-cli +. Récupérez à nouveau le contenu avec + keys * +:

keys *

Et vous devriez obtenir un résultat similaire à ceci:

Output1) "PHPREDIS_SESSION:j9rsgtde6st2rqb6lu5u6f4h83"

Cela montre que les informations de session sont stockées sur le serveur Redis. Vous pouvez connecter des serveurs Web supplémentaires au serveur Redis de la même manière.

Conclusion

Redis est un service de stockage clé-valeur puissant et rapide qui peut également être utilisé comme gestionnaire de session pour PHP, permettant de créer des environnements PHP évolutifs en fournissant un système distribué pour le stockage de session. Pour plus d’informations sur la mise à l’échelle des applications PHP, vous pouvez consulter cet article: Horizontally Scaling PHP Applications.