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

introduction

Redis est un système de stockage et de cache clé-valeur open source, également appelé serveur de structure de données en raison de 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 utile dans les 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 exécutée sous Ubuntu 16.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. Cela fonctionne assez bien pour un serveur unique, mais présente des limitations importantes en termes de performances et d’évolutivité car les informations de session sont liées à un serveur unique.

Un gestionnaire de session externe fournit un emplacement central pour les données de session partagées pouvant être utilisées par plusieurs serveurs d’applications. Ceci est important lors de la création de scalable PHP environnements derrière un https://www.digitalocean.com/community/tutorials/an- introduction-to-haproxy-and-load-balancing-concepts [équilibreur de charge], car les mêmes données de session seront disponibles quel que soit le serveur d’applications servant une requête individuelle.

Conditions préalables

Ce tutoriel va configurer la gestion de session en utilisant deux serveurs. Pour suivre, vous aurez besoin de:

  • Un serveur Web PHP exécutant LAMP ou https: //www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04[LEMP] sur Ubuntu 16.04. Nous désignerons ce serveur par * web *.

  • Un second serveur propre Ubuntu 16.04 sur lequel Redis sera installé. Nous allons appeler ce serveur * redis *.

Vous devrez avoir un utilisateur non root avec les privilèges sudo + configurés sur chacun de ces serveurs. Nous supposerons également que chacun des serveurs est doté d’un pare-feu de base. Vous pouvez configurer ces deux exigences en suivant notre Ubuntu 16.04 Guide de configuration du serveur initial sur les deux serveurs.

Étape 1: Installez le logiciel client et serveur Redis

Notre première étape consistera à installer le logiciel nécessaire sur nos deux machines. Notre machine * redis * aura besoin d’un serveur Redis. Sur notre machine * web *, nous installerons l’extension PHP Redis pour la gestion de session et le client de ligne de commande Redis pour les tests.

Installer le serveur Redis

La première chose à faire est d’exécuter le serveur Redis sur notre machine * redis *.

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 apt-add-repository ppa:chris-lea/redis-server

Appuyez sur + ENTER pour confirmer.

Ensuite, mettez à jour l’index du paquet et installez le serveur Redis en tapant:

sudo apt-get update
sudo apt-get install redis-server

Redis devrait maintenant être installé et en cours d’exécution sur votre serveur. Vérifiez que le service est en cours d’exécution et accepte les connexions en tapant:

redis-cli ping
Redis server outputPONG

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

Installation du client Redis et de l’extension PHP

Ensuite, installez le client de ligne de commande Redis et l’extension PHP Redis sur le serveur * Web *. Nous utiliserons le client en ligne de commande pour tester facilement la connectivité et l’authentification. Nous utiliserons l’extension PHP pour stocker nos données de session.

Mettez à jour l’index de paquet local et installez le logiciel sur votre serveur * Web * en tapant:

sudo apt-get update
sudo apt-get install redis-tools php-redis

Vous devriez maintenant avoir accès à l’outil + redis-cli +, bien que vous n’ayez pas encore accès au serveur à tester.

Étape 2: Configurez Redis pour accepter les connexions externes

Par défaut, Redis autorise uniquement les connexions à partir de + localhost +, ce qui signifie que vous n’avez accès qu’à partir du serveur sur lequel Redis est installé. Nous devons modifier cette configuration pour autoriser les connexions provenant d’autres serveurs.

Redis n’offre aucune option de cryptage native et suppose qu’il a été déployé sur un réseau isolé de pairs de confiance. Cela signifie que pour autoriser de manière sécurisée les connexions externes, les deux serveurs doivent se trouver sur un réseau isolé ou vous devez sécuriser le trafic entre eux d’une autre manière.

Si Redis est déployé sur un réseau isolé…

Si vos serveurs fonctionnent sur un réseau isolé, il vous suffira probablement d’ajuster le fichier de configuration de Redis pour vous connecter à l’adresse IP de votre réseau isolé.

Sur le serveur * redis *, sauvegardez et ouvrez le fichier de configuration Redis:

sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
sudo nano /etc/redis/redis.conf

Recherchez la ligne + bind + et ajoutez l’adresse IP du réseau isolé du serveur Redis:

/etc/redis/redis.conf

bind 127.0.0.1

Enregistrez et fermez le fichier. Redémarrez le service en tapant:

sudo systemctl restart redis-server.service

Ouvrez l’accès au port Redis:

sudo ufw allow 6379

Redis peut maintenant accepter les connexions de votre réseau isolé.

Si Redis n’est pas déployé sur un réseau isolé…

Pour les réseaux qui ne sont pas isolés ou que vous ne contrôlez pas, il est impératif que le trafic soit sécurisé par d’autres moyens. Il existe de nombreuses options pour sécuriser le trafic sur les serveurs Redis, notamment:

En utilisant l’une des méthodes ci-dessus, configurez un accès sécurisé à partir de votre serveur * Web * vers votre serveur * redis *. Vous aurez besoin de connaître l’adresse IP et le port que votre machine * web * utilisera pour se connecter au service Redis sur la machine distante.

À ce stade, vous devriez pouvoir accéder à votre serveur Redis à partir du serveur Web en toute sécurité.

É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 fichier de configuration Redis dans + / etc / redis / redis.conf +:

sudo nano /etc/redis/redis.conf

Recherchez la directive + requirepass + et définissez-la sur une phrase secrète forte. Bien que votre trafic Redis doit être sécurisé de tiers, cela fournit une authentification à Redis lui-même. Comme Redis est rapide et n’évalue pas le nombre de tentatives de mot de passe, choisissez un mot de passe complexe et complexe pour vous protéger contre les tentatives de force brutale:

/etc/redis/redis.conf

requirepass

Enregistrez et fermez le fichier lorsque vous avez terminé.

Redémarrez le service Redis pour implémenter le changement:

sudo systemctl restart redis-server.service

Votre serveur Redis devrait maintenant rejeter les demandes non authentifiées.

Étape 4: Testez la connexion et l’authentification Redis

Pour vérifier si vos modifications fonctionnent comme prévu, connectez-vous au service Redis à partir de la machine * Web *.

Par défaut, le serveur Redis écoute 6379 sur l’interface locale, mais chacune des options de sécurité réseau décrites ci-dessus modifie en quelque sorte la valeur par défaut pour les tiers. Nous pouvons utiliser le client + redis-cli + avec l’option + -h + pour spécifier l’adresse IP et l’option + -p + pour spécifier le port nécessaire à la connexion au service distant. Vous pouvez laisser l’une ou l’autre de ces options si elles utilisent les options par défaut (127.0.0.1 et 6379 respectivement).

Les valeurs que vous utiliserez dépendront de la méthode que vous avez utilisée pour sécuriser votre trafic réseau:

  • * réseau isolé *: utilisez l’adresse IP du réseau isolé du serveur Redis. Le port Redis par défaut (6379) est utilisé, nous n’avons donc pas besoin de le mentionner: + redis-cli -h +

  • * stunnel * ou * spiped *: utilisez le port local qui relie le service Redis distant: + redis-cli -p +

  • * PeerVPN *: utilisez l’adresse IP VPN du serveur Redis: + redis-cli -h 10.8.0. +

La forme générale est:

redis-cli -h  -p

Vous devriez pouvoir vous connecter à l’instance Redis distante à partir du serveur * Web *.

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 *
Web server 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

Vous devriez obtenir un * OK * en réponse indiquant que vos informations d’identification ont été acceptées.

Web server outputOK

Ensuite, listez les clés définies dans Redis:

keys *

S’il s’agit d’un nouveau serveur Redis, le résultat devrait ressembler à ceci:

Web server output(empty list or set)

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

Revenez au shell de commande en tapant:

exit

Maintenant que nous avons vérifié que nous pouvons nous connecter avec authentification, nous pouvons faire de Redis notre gestionnaire de session par défaut.

Étape 5: Définissez Redis en tant que 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 * sur Ubuntu 16.04 installée à partir des référentiels par défaut, il s’agit généralement de + / etc / php / 7.0 / apache2 / php.ini + . Pour une pile * LEMP * sous Ubuntu 16.04, le chemin est généralement `+ / etc / php / 7.0 / fpm / php.ini +. Si vous avez vérifié que l’un de ces emplacements est correct, n’hésitez pas à passer à la section suivante.

(Facultatif) Trouver le fichier php.ini correct

Si vous n’êtes pas sûr de l’emplacement de votre fichier + php.ini principal, vous pouvez le savoir en utilisant la fonction` + phpinfo () + . Ouvrez un fichier sur votre serveur * web * appelé `+ info.php + dans la racine de votre document, qui sera par défaut + / var / www / html + pour LAMP et LEMP:

sudo nano /info.php

Placez le code suivant dans le fichier:

/var/www/html/info.php

<?php
phpinfo();

Accédez au nom de domaine ou à l’adresse IP de votre serveur * Web * dans votre navigateur, suivi de + / info.php +:

http:///info.php

Recherchez la ligne contenant «Fichier de configuration chargé» et vous devriez trouver l’emplacement exact du fichier + php.ini + principal chargé.

Supprimez le fichier lorsque vous avez terminé, car il affiche des informations sensibles sur votre environnement:

sudo rm /info.php

Maintenant que vous savez où se trouve le fichier, vous pouvez passer à l’édition.

Modification de la configuration

Ouvrez le fichier + php.ini pour le modifier.

Si vous utilisez une pile * LAMP * dans sa configuration par défaut, la commande dont vous aurez besoin est la suivante:

sudo nano /etc/php/7.0/apache2/php.ini

Si vous utilisez une pile * LEMP * dans sa configuration par défaut, la commande dont vous aurez besoin est la suivante:

sudo nano /etc/php/7.0/fpm/php.ini

Si vous avez découvert un chemin différent à l’aide de la méthode + phpinfo () + décrite ci-dessus, remplacez-le ici.

Dans le fichier + php.ini, recherchez la ligne contenant` + session.save_handler`. La valeur par défaut est + fichiers +. Changez ceci en + redis + pour utiliser l’extension PHP Redis.

php.ini

session.save_handler =

Ensuite, trouvez la ligne contenant + session.save_path +. Vous devrez supprimer le commentaire et modifier la valeur afin qu’elle contienne votre chaîne de connexion Redis.

La chaîne de connexion peut être construite en utilisant le format suivant, le tout sur une seule ligne:

tcp://:?auth=

Encore une fois, les valeurs appropriées dépendent de la stratégie de réseau sécurisée que vous avez sélectionnée. Utilisez les mêmes valeurs que celles que vous avez fournies précédemment à la commande + redis-cli +. Par exemple, si vous utilisiez + stunnel + ou + spiped +, le + session.save_path + ressemblerait probablement à ceci:

php.ini

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

Enregistrez et fermez le fichier lorsque vous avez terminé. Ensuite, redémarrez le service PHP pour implémenter vos modifications.

Dans les environnements * LAMP *, tapez:

sudo systemctl restart apache2

Dans les environnements * LEMP *, tapez:

sudo systemctl restart php7.0-fpm

PHP devrait maintenant être configuré pour utiliser Redis en tant que gestionnaire de session.

Étape 6: 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 qui stocke les informations dans les sessions. Nous allons utiliser un script simple qui implémente un compteur. Chaque fois que vous rechargez la page, le numéro imprimé sera incrémenté.

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

sudo nano test.php

A l’intérieur, collez le code suivant:

/var/www/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;

Enregistrez et fermez le fichier.

Pointez votre navigateur sur l’adresse IP publique du serveur * web * suivie de + / test.php + afin d’accéder au script:

http:///test.php

Il faut incrémenter le nombre que vous voyez chaque fois que vous rechargez la page.

Maintenant, sur votre machine * redis *, utilisez + redis-cli + pour ouvrir une session. Puisque nous nous connectons à l’instance locale, nous n’avons pas à fournir d’adresse IP ou de port:

redis-cli

Authentifiez-vous avec le mot de passe Redis:

AUTH
Redis server outputOK

Maintenant, vérifiez les clés existantes:

keys *

Vous devriez voir une nouvelle entrée pour notre session PHP:

Redis server output1) "PHPREDIS_SESSION:"

Si vous demandez la valeur de la clé, vous devriez pouvoir voir la valeur actuelle du compteur:

get PHPREDIS_SESSION:
Redis server output"count|i:;"

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 pour une gestion centralisée des sessions.

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.