So richten Sie einen Redis-Server als Session-Handler für PHP unter Ubuntu 16.04 ein

Einführung

Redis ist ein Open-Source-Schlüsselwert-Cache- und Speichersystem, das auch als Datenstrukturserver bezeichnet wird, da es verschiedene Datentypen wie Hashes, Listen, Mengen und Bitmaps unterstützt. Es unterstützt auch Clustering und ist daher in hochverfügbaren und skalierbaren Umgebungen nützlich.

In diesem Tutorial erfahren Sie, wie Sie einen externen Redis-Server installieren und konfigurieren, der als Sitzungshandler für eine PHP-Anwendung unter Ubuntu 16.04 verwendet wird.

Der Session-Handler ist für das Speichern und Abrufen von in Sessions gespeicherten Daten verantwortlich. Standardmäßig verwendet PHP hierfür * files *. Dies funktioniert gut genug für einen einzelnen Server, weist jedoch einige erhebliche Leistungs- und Skalierbarkeitseinschränkungen auf, da die Sitzungsinformationen an einen einzelnen Server gebunden sind.

Ein externer Sitzungshandler bietet einen zentralen Speicherort für freigegebene Sitzungsdaten, die von mehreren Anwendungsservern verwendet werden können. Dies ist wichtig, wenn Sie scalable PHP surroundings hinter einer https://www.digitalocean.com/community/tutorials/an- erstellen. Einführung in Haproxy- und Lastausgleichskonzepte [Load Balancer], da dieselben Sitzungsdaten verfügbar sind, unabhängig davon, welcher Anwendungsserver eine einzelne Anforderung bedient.

Voraussetzungen

In diesem Lernprogramm wird die Sitzungsbehandlung mit zwei Servern konfiguriert. Um mitzukommen, benötigen Sie:

  • Ein PHP-Webserver mit LAMP oder https: //www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04[LEMP] unter Ubuntu 16.04. Wir werden diesen Server als * web * bezeichnen.

  • Ein zweiter, sauberer Ubuntu 16.04 Server, auf dem Redis installiert wird. Wir werden diesen Server als * redis * bezeichnen.

Sie benötigen einen Nicht-Root-Benutzer mit "+ sudo +" - Berechtigungen, der auf jedem dieser Server konfiguriert ist. Wir gehen auch davon aus, dass auf jedem Server eine grundlegende Firewall ausgeführt wird. Sie können diese beiden Anforderungen einrichten, indem Sie auf beiden Servern unserer Ubuntu 16.04 - Handbuch zur Erstinstallation von Servern folgen.

Schritt 1: Installieren Sie die Redis Server- und Client-Software

Unser erster Schritt wird darin bestehen, die erforderliche Software auf unseren beiden Maschinen zu installieren. Unsere * redis * -Maschine benötigt einen Redis-Server. Auf unserer * web * -Maschine installieren wir die Redis-PHP-Erweiterung für die Sitzungsverwaltung und den Redis-Befehlszeilen-Client zum Testen.

Installation des Redis-Servers

Als erstes müssen wir den Redis-Server auf unserer * redis * -Maschine zum Laufen bringen.

Wir werden den regulären Ubuntu-Paketmanager mit einem vertrauenswürdigen PPA-Repository verwenden, das von Chris Lea bereitgestellt wird. Dies ist notwendig, um sicherzustellen, dass wir die neueste stabile Version von Redis erhalten.

Fügen Sie zunächst das PPA-Repository hinzu, indem Sie Folgendes ausführen:

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

Drücken Sie + ENTER zur Bestätigung.

Aktualisieren Sie als Nächstes den Paketindex und installieren Sie den Redis-Server, indem Sie Folgendes eingeben:

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

Redis sollte jetzt auf Ihrem Server installiert sein und ausgeführt werden. Testen Sie, ob der Dienst ausgeführt wird und Verbindungen akzeptiert, indem Sie Folgendes eingeben:

redis-cli ping
Redis server outputPONG

Dadurch wird eine Verbindung zur Redis-Instanz hergestellt, die auf * localhost * an Port * 6379 * ausgeführt wird. Sie sollten * PONG * als Antwort erhalten.

Installation des Redis-Clients und der PHP-Erweiterung

Installieren Sie als Nächstes den Redis-Befehlszeilenclient und die Redis-PHP-Erweiterung auf dem * web * -Server. Wir werden den Befehlszeilen-Client verwenden, um die Konnektivität und Authentifizierung einfach zu testen. Wir werden die PHP-Erweiterung verwenden, um unsere Sitzungsdaten zu speichern.

Aktualisieren Sie den lokalen Paketindex und installieren Sie die Software auf Ihrem * Web * -Server, indem Sie Folgendes eingeben:

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

Sie sollten nun Zugriff auf das Tool "+ redis-cli +" haben, obwohl Sie noch keinen Zugriff auf den zu testenden Server haben.

Schritt 2: Konfigurieren Sie Redis so, dass externe Verbindungen akzeptiert werden

Standardmäßig lässt Redis nur Verbindungen von "+ localhost +" zu. Dies bedeutet, dass Sie nur auf den Server zugreifen können, auf dem Redis installiert ist. Wir müssen diese Konfiguration ändern, um Verbindungen von anderen Servern zuzulassen.

Redis bietet keine nativen Verschlüsselungsoptionen und geht davon aus, dass es in einem isolierten Netzwerk vertrauenswürdiger Peers bereitgestellt wurde. Dies bedeutet, dass sich beide Server entweder in einem isolierten Netzwerk befinden müssen, um externe Verbindungen sicher zuzulassen, oder dass Sie den Datenverkehr zwischen ihnen auf andere Weise sichern müssen.

Wenn Redis in einem isolierten Netzwerk bereitgestellt wird…

Wenn Ihre Server in einem isolierten Netzwerk betrieben werden, müssen Sie möglicherweise nur die Konfigurationsdatei von Redis anpassen, um sie an die IP-Adresse Ihres isolierten Netzwerks zu binden.

Sichern und öffnen Sie auf dem * redis * -Server die Redis-Konfigurationsdatei:

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

Suchen Sie die Zeile "+ bind +" und hängen Sie die IP-Adresse des isolierten Redis-Servers an:

/etc/redis/redis.conf

bind 127.0.0.1

Speichern und schließen Sie die Datei. Starten Sie den Dienst neu, indem Sie Folgendes eingeben:

sudo systemctl restart redis-server.service

Öffnen Sie den Zugang zum Redis-Port:

sudo ufw allow 6379

Redis kann jetzt Verbindungen von Ihrem isolierten Netzwerk akzeptieren.

Wenn Redis nicht in einem isolierten Netzwerk bereitgestellt wird…

Für Netzwerke, die nicht isoliert sind oder die Sie nicht steuern, muss der Datenverkehr unbedingt auf andere Weise gesichert werden. Es gibt viele Optionen zum Sichern des Datenverkehrs zu Redis-Servern, darunter:

  • Tunneling with stunnel: Sie müssen eine einrichten Eingehender Tunnel auf dem * redis * -Server und ausgehender Tunnel auf dem * web * -Server. Der Webserver stellt eine Verbindung zu einem lokalen Port her, um mit dem Remote-Redis-Dienst zu kommunizieren.

  • Tunneling with spiped: Der * web * -Server sollte funktionieren als + spiped + client machine. Sie müssen auf jedem Server eine System-Unit-Datei erstellen. Der Webserver stellt eine Verbindung zu einem lokalen Port her, um mit dem Remote-Redis-Dienst zu kommunizieren.

  • Einrichten eines VPN mit PeerVPN: Beide Server benötigen über das VPN erreichbar sein. Der * Web * -Server kann mit seiner VPN-IP-Adresse auf den * Redis * -Server zugreifen.

Konfigurieren Sie mit einer der oben genannten Methoden den sicheren Zugriff von Ihrem * Web * -Server auf Ihren * Redis * -Server. Sie müssen die IP-Adresse und den Port kennen, die Ihr * Web * -Maschine verwenden wird, um eine Verbindung zum Redis-Dienst auf der Remote-Maschine herzustellen.

Zu diesem Zeitpunkt sollten Sie vom Webserver aus sicher auf Ihren Redis-Server zugreifen können.

Schritt 3: Legen Sie ein Passwort für den Redis Server fest

Um Ihrer Redis-Installation eine zusätzliche Sicherheitsebene hinzuzufügen, sollten Sie ein Kennwort für den Zugriff auf die Serverdaten festlegen. Wir werden die Redis-Konfigurationsdatei unter + / etc / redis / redis.conf + bearbeiten:

sudo nano /etc/redis/redis.conf

Suchen Sie die Direktive "+ requirepass +" und setzen Sie sie auf eine starke Passphrase. Während Ihr Redis-Datenverkehr vor externen Parteien sicher sein sollte, bietet dies eine Authentifizierung für Redis selbst. Da Redis schnell ist und die Anzahl der Kennwortversuche nicht begrenzt, wählen Sie eine starke, komplexe Passphrase, um sich vor Brute-Force-Versuchen zu schützen:

/etc/redis/redis.conf

requirepass

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Starten Sie den Redis-Dienst neu, um die Änderung zu implementieren:

sudo systemctl restart redis-server.service

Ihr Redis-Server sollte jetzt nicht authentifizierte Anforderungen ablehnen.

Schritt 4: Testen Sie die Verbindung und Authentifizierung von Redis

Um zu testen, ob Ihre Änderungen wie erwartet funktionieren, stellen Sie vom * web * -Maschine aus eine Verbindung zum Redis-Dienst her.

Standardmäßig überwacht der Redis-Server 6379 auf der lokalen Schnittstelle, aber jede der oben beschriebenen Netzwerksicherheitsoptionen ändert die Standardeinstellungen in irgendeiner Weise für externe Parteien. Wir können den Client "+ redis-cli " mit der Option " -h " verwenden, um die IP-Adresse anzugeben, und die Option " -p +", um den Port anzugeben, der für die Verbindung zum Remote-Dienst erforderlich ist. Sie können eine dieser Optionen weglassen, wenn Sie die Standardoptionen (127.0.0.1 bzw. 6379) verwenden.

Die Werte, die Sie verwenden, hängen von der Methode ab, die Sie zum Sichern Ihres Netzwerkverkehrs verwendet haben:

  • * isoliertes Netzwerk *: Verwenden Sie die IP-Adresse des isolierten Netzwerks des Redis-Servers. Der Standard-Redis-Port (6379) wird verwendet, daher brauchen wir ihn nicht zu erwähnen: + redis-cli -h +

  • * stunnel * oder * spiped *: Verwenden Sie den lokalen Port, der zum Remote-Redis-Dienst tunnelt: + redis-cli -p +

  • * PeerVPN *: Verwenden Sie die VPN-IP-Adresse des Redis-Servers: + redis-cli -h 10.8.0. +

Die allgemeine Form ist:

redis-cli -h  -p

Sie sollten in der Lage sein, vom * Web * -Server aus eine Verbindung zur Remote-Redis-Instanz herzustellen.

Wenn Sie ein Passwort definiert haben und nun versuchen, auf die Daten zuzugreifen, sollten Sie einen AUTH-Fehler erhalten:

keys *
Web server output(error) NOAUTH Authentication required.

Um sich zu authentifizieren, müssen Sie nur den Befehl "+ AUTH " ausführen und das gleiche Passwort eingeben, das Sie in der Datei " / etc / redis / redis.conf +" definiert haben:

AUTH

Sie sollten ein * OK * als Antwort erhalten, um anzuzeigen, dass Ihre Anmeldeinformationen akzeptiert wurden.

Web server outputOK

Als Nächstes listen Sie die Schlüssel auf, die in Redis festgelegt sind:

keys *

Wenn dies ein frischer Redis-Server ist, sollte die Ausgabe ungefähr so ​​aussehen:

Web server output(empty list or set)

Diese Ausgabe bedeutet nur, dass Ihr Redis-Server leer ist, was genau das ist, was wir erwarten. Der * Web * -Server ist noch nicht für die Verwendung dieses Redis-Servers als Sitzungshandler konfiguriert.

Kehren Sie zur Befehls-Shell zurück, indem Sie Folgendes eingeben:

exit

Nachdem wir überprüft haben, ob die Verbindung mit der Authentifizierung erfolgreich hergestellt werden kann, können wir Redis als Standard-Sitzungshandler festlegen.

Schritt 5: Legen Sie Redis als Standard-Sitzungshandler auf dem Webserver fest

Jetzt müssen wir die Datei "+ php.ini" auf dem * web * -Server bearbeiten, um den Standard-Session-Handler für PHP zu ändern. Der Speicherort dieser Datei hängt von Ihrem aktuellen Stapel ab.

Für einen * LAMP * -Stack unter Ubuntu 16.04, der aus den Standard-Repositorys installiert wurde, ist dies normalerweise "+ / etc / php / 7.0 / apache2 / php.ini ". Für einen * LEMP * -Stack unter Ubuntu 16.04 lautet der Pfad normalerweise ` / etc / php / 7.0 / fpm / php.ini +`. Wenn Sie überprüft haben, dass einer dieser Speicherorte korrekt ist, können Sie den nächsten Abschnitt überspringen.

(Optional) Suchen der richtigen php.ini-Datei

Wenn Sie sich nicht sicher sind, wo sich Ihre Hauptdatei "+ php.ini" befindet, können Sie dies mit der Funktion "+ phpinfo () " herausfinden. Öffnen Sie eine Datei mit dem Namen " info.php " in Ihrem Dokumentstamm auf Ihrem * Web * -Server. Diese lautet standardmäßig " / var / www / html +" für LAMP und LEMP:

sudo nano /info.php

Fügen Sie den folgenden Code in die Datei ein:

/var/www/html/info.php

<?php
phpinfo();

Besuchen Sie den Domain-Namen oder die IP-Adresse Ihres * Web * -Servers in Ihrem Browser, gefolgt von "+ / info.php +":

http:///info.php

Suchen Sie nach der Zeile mit "Loaded Configuration File" (Geladene Konfigurationsdatei) und finden Sie den genauen Speicherort der geladenen Hauptdatei "+ php.ini +".

Entfernen Sie die Datei, wenn Sie fertig sind, da darin vertrauliche Informationen zu Ihrer Umgebung angezeigt werden:

sudo rm /info.php

Jetzt, da Sie wissen, wo sich die Datei befindet, können Sie mit der Bearbeitung fortfahren.

Ändern der Konfiguration

Öffnen Sie die Datei "+ php.ini" zum Bearbeiten.

Wenn Sie einen * LAMP * -Stack in seiner Standardkonfiguration verwenden, benötigen Sie den folgenden Befehl:

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

Wenn Sie einen * LEMP * -Stack in seiner Standardkonfiguration verwenden, benötigen Sie den folgenden Befehl:

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

Wenn Sie mit der oben beschriebenen Methode "+ phpinfo () +" einen anderen Pfad gefunden haben, ersetzen Sie diesen Pfad stattdessen hier.

Suchen Sie in der Datei "+ php.ini" nach der Zeile mit "+ session.save_handler". Der Standardwert ist "+ files ". Ändern Sie dies in " redis +", um die Redis-PHP-Erweiterung zu verwenden.

php.ini

session.save_handler =

Suchen Sie als nächstes die Zeile mit + session.save_path +. Sie müssen das Kommentarzeichen entfernen und den Wert so ändern, dass er Ihre Redis-Verbindungszeichenfolge enthält.

Die Verbindungszeichenfolge kann im folgenden Format in einer Zeile erstellt werden:

tcp://:?auth=

Die richtigen Werte hängen wiederum von der ausgewählten Strategie für sichere Netzwerke ab. Verwenden Sie dieselben Werte, die Sie zuvor für den Befehl + redis-cli + angegeben haben. Wenn Sie beispielsweise "+ stunnel " oder " spiped " verwenden, sieht der " session.save_path +" wahrscheinlich so aus:

php.ini

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

Speichern und schließen Sie die Datei, wenn Sie fertig sind. Starten Sie anschließend den PHP-Dienst neu, um Ihre Änderungen zu implementieren.

Geben Sie in * LAMP * -Umgebungen Folgendes ein:

sudo systemctl restart apache2

Geben Sie in * LEMP * -Umgebungen Folgendes ein:

sudo systemctl restart php7.0-fpm

PHP sollte jetzt so konfiguriert sein, dass Redis als Sitzungshandler verwendet wird.

Schritt 6: Testen Sie das Redis Session Handling

Um sicherzustellen, dass Ihre Sitzungen jetzt von Redis verarbeitet werden, benötigen Sie ein PHP-Skript oder eine PHP-Anwendung, die Informationen in Sitzungen speichert. Wir werden ein einfaches Skript verwenden, das einen Zähler implementiert. Jedes Mal, wenn Sie die Seite neu laden, wird die gedruckte Nummer erhöht.

Erstellen Sie eine Datei mit dem Namen "+ test.php +" auf dem * web * -Server in Ihrem Dokumentenstammordner:

sudo nano test.php

Fügen Sie den folgenden Code ein:

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

Speichern und schließen Sie die Datei.

Zeigen Sie mit Ihrem Browser auf die öffentliche IP-Adresse des * web * -Servers, gefolgt von "+ / test.php +", um auf das Skript zuzugreifen:

http:///test.php

Es sollte die Zahl erhöhen, die bei jedem erneuten Laden der Seite angezeigt wird.

Verwenden Sie jetzt auf Ihrem * redis * -Maschine + redis-cli +, um eine Sitzung zu öffnen. Da wir eine Verbindung zur lokalen Instanz herstellen, müssen wir keine IP-Adresse oder keinen Port angeben:

redis-cli

Authentifizieren Sie sich mit dem Redis-Passwort:

AUTH
Redis server outputOK

Überprüfen Sie nun die vorhandenen Schlüssel:

keys *

Sie sollten einen neuen Eintrag für unsere PHP-Sitzung sehen:

Redis server output1) "PHPREDIS_SESSION:"

Wenn Sie nach dem Wert des Schlüssels fragen, sollten Sie den aktuellen Zählerwert sehen können:

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

Dies zeigt, dass die Sitzungsinformationen auf dem Redis-Server gespeichert werden. Sie können zusätzliche Webserver mit dem Redis-Server verbinden, um die Sitzung zentral zu verwalten.

Fazit

Redis ist ein leistungsstarker und schneller Schlüsselwertspeicherdienst, der auch als Sitzungshandler für PHP verwendet werden kann und skalierbare PHP-Umgebungen ermöglicht, indem ein verteiltes System für die Sitzungsspeicherung bereitgestellt wird. Weitere Informationen zum Skalieren von PHP-Anwendungen finden Sie in diesem Artikel: Horizontally Scaling PHP Applications.