So geben Sie PHP-Sitzungen auf mehreren Memcached Servern unter Ubuntu frei 14.04

Einführung

Memcached ist ein Cachesystem für verteilte Objekte, das Informationen im Speicher und nicht auf der Festplatte speichert, um einen schnelleren Zugriff zu ermöglichen. Das PHP-Memcache-Modul kann verwendet werden, um Sitzungen abzuwickeln, die andernfalls im Dateisystem gespeichert würden. Das Speichern von PHP-Sitzungen in Memcached hat den Vorteil, dass diese auf mehrere Cloud-Server verteilt werden können, auf denen Memcached ausgeführt wird, um die Sitzungsredundanz aufrechtzuerhalten.

Wenn Ihre Anwendung ohne dieses Memcached-Setup auf mehreren Servern lastausgeglichen wird, muss die Sitzungsstabilität auf dem Load Balancer konfiguriert werden. Dies erhält die Benutzererfahrung und verhindert, dass sie plötzlich abgemeldet werden. Durch die Konfiguration von Memcached für die Abwicklung von Sitzungen wird sichergestellt, dass alle Cloud-Server im Memcached-Pool über dieselben Sitzungsdaten verfügen, sodass nicht mehr ein einziger Server für die Beibehaltung der Sitzung erforderlich ist.

Voraussetzungen

In diesem Tutorial wird davon ausgegangen, dass Sie mit setting up LAMP vertraut sind Server in Ubuntu. + Dieses Setup verwendet 3 Droplets mit dem * Ubuntu 14.04 * -Image.

  • Tröpfchen 1 *

  • Name: lamp01

  • Öffentliche IP: 1.1.1.1

  • Private IP: 10.1.1.1

  • Tröpfchen 2 *

  • Name: lamp02

  • Öffentliche IP: 2.2.2.2

  • Private IP: 10.2.2.2

  • Tröpfchen 3 *

  • Name: lamp03

  • Öffentliche IP: 3.3.3.3

  • Private IP: 10.3.3.3

Stellen Sie sicher, dass das Kontrollkästchen Private Networking beim Erstellen der Droplets aktiviert ist. Notieren Sie sich auch die privaten IP-Adressen, da diese später benötigt werden.

Installieren Sie LAMP auf allen drei Servern.

Aktualisieren Sie zuerst das Repository und installieren Sie Apache.

apt-get update
apt-get install apache2

Installieren Sie die mod_php-Erweiterung von PHP und Apache.

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

Weitere Informationen finden Sie unter dieser Artikel.

Erster Schritt - Installieren Sie die Memcache-Pakete

Installieren Sie auf * lamp01 * den Memcached-Daemon und das Memcache-Modul von PHP.

apt-get install php5-memcache memcached

PHP hat zwei Pakete: php5-memcache und php5-memcached (beachte das "d" am Ende). Wir werden das erste Paket (memcache) verwenden, da es ohne Abhängigkeiten leichter ist. Lesen Sie den Vergleich zwischen memcache und memcached.

Der Memcachedienst überwacht nur localhost (127.0.0.1). Dies muss geändert werden, um Verbindungen aus dem privaten Netzwerk zu akzeptieren.

nano /etc/memcached.conf

Suchen Sie die folgende Zeile:

-l 127.0.0.1

Ändern Sie es, um die private IP-Adresse dieses Servers abzuhören.

-l

Starten Sie den Dienst + memcached + neu.

service memcached restart

Wiederholen Sie diese Schritte auf den beiden anderen Servern und ersetzen Sie "+ 127.0.0.1 +" durch die entsprechende private IP-Adresse.

  • lamp02 *

-l
  • lamp03 *

-l

Starten Sie den Dienst "+ memcached +" auf den zweiten beiden Servern neu.

Zweiter Schritt - Memcached als PHP-Session-Handler festlegen

Öffnen Sie auf * lamp01 * die Datei + php.ini zum Bearbeiten.

nano /etc/php5/apache2/php.ini

Diese Datei befindet sich bei PHP-FPM-Installationen unter + / etc / php5 / fpm / php.ini +.

Suchen Sie die folgenden Konfigurationsanweisungen:

session.save_handler =
session.save_path =

Ändern Sie sie wie folgt, um Memcache zu verwenden. Verwenden Sie alle drei privaten IP-Adressen im + session.save_path +.

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

Möglicherweise müssen Sie + session.save_path + auskommentieren, indem Sie das Semikolon am Anfang entfernen. Denken Sie daran, die Portnummer * 11211 * nach jeder IP-Adresse einzugeben, da Memcached diesen Port überwacht.

Fügen Sie auf den beiden anderen Servern genau dieselben Einstellungen hinzu.

Ein * lamp02 *:

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

Ein * lamp03 *:

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

Diese Konfiguration muss auf allen Droplets identisch sein, damit die Sitzungsfreigabe ordnungsgemäß funktioniert.

Dritter Schritt - Konfigurieren Sie Memcache für Sitzungsredundanz

Bearbeiten Sie auf * lamp01 * die Datei + memcache.ini +.

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

Fügen Sie die folgenden Konfigurationsanweisungen am Ende dieser Datei hinzu.

memcache.allow_failover=1
memcache.session_redundancy=4

Die Anweisung "+ memcache.session_redundancy +" muss der Anzahl der zwischengespeicherten Server + 1 entsprechen, damit die Sitzungsinformationen auf alle Server repliziert werden. Dies liegt an einem bug in PHP.

Diese Direktiven ermöglichen Sitzungs-Failover und -Redundanz, sodass PHP die Sitzungsinformationen auf alle Server schreibt, die in + session.save_path + angegeben sind. ähnlich einem RAID-1-Setup.

Starten Sie den Webserver oder den PHP-FPM-Daemon neu, je nachdem, was gerade verwendet wird.

service apache2 reload

Wiederholen Sie diese Schritte genau für * lamp02 * und * lamp03 *.

Vierter Schritt - Redundanz der Testsitzung

Um dieses Setup zu testen, erstellen Sie das folgende PHP-Skript für alle 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);
?>

Dieses Skript dient nur zu Testzwecken und kann entfernt werden, sobald die Droplets eingerichtet sind.

Greifen Sie auf diese Datei im ersten Droplet mit curl zu und extrahieren Sie die Cookie-Informationen.

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

Dadurch wird eine Ausgabe ähnlich der folgenden zurückgegeben.

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

Kopieren Sie das Cookie "+ PHPSESSID +" und senden Sie die Anfrage mit diesem Cookie an die anderen Droplets. Diese Sitzung wird von PHP entfernt, wenn 1440 Sekunden lang keine Anforderungen gestellt wurden. Vergewissern Sie sich daher, dass Sie den Test innerhalb dieses Zeitraums abschließen. Lesen Sie mehr über PHPs session.gc-maxlifetime, um mehr darüber zu erfahren.

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

Sie werden feststellen, dass die Sitzung auf alle Droplets übertragen wird.

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
)

Beenden Sie zum Testen des Failovers den Dienst "+ memcached +" und greifen Sie auf diese Datei zu.

service memcached stop

Das Droplet verwendet transparent die Sitzungsinformationen, die auf den beiden anderen Servern gespeichert sind.

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

Ausgabe:

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

Jetzt kann ein Lastenausgleich so konfiguriert werden, dass Anforderungen gleichmäßig verteilt werden, ohne dass die Sitzungsstabilität mühsam konfiguriert werden muss.

Starten Sie + memcached + erneut, wenn Sie mit dem Testen fertig sind:

service memcached start

Fünfter Schritt - Secure Memcached with IPTables

Auch wenn Memcached das private Netzwerk verwendet, können andere DigitalOcean-Benutzer im selben Rechenzentrum eine Verbindung zu Ihrem Droplet herstellen, wenn sie Ihre private IP-Adresse kennen. Wir werden also https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall- using-iptables-on-ubuntu-14-04[set up IPTables rules] nur zulassen die Cloud-Server in unserem Memcached-Pool, um miteinander zu kommunizieren.

Wir führen diesen Schritt aus, nachdem wir die Sitzungsredundanz getestet haben, um Probleme zu beheben, die auftreten können, wenn falsche Regeln angewendet werden.

Erstellen Sie Firewall-Regeln für * lamp01 * mit den privaten IP-Adressen * lamp02 * und * 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

Auf einem typischen LAMP-Server sind die folgenden Regeln vollständig:

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

Geben Sie die Firewall-Regeln für * lamp02 * mit den privaten IP-Adressen * lamp01 * und * lamp03 * ein.

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

Machen Sie dasselbe auf * lamp03 * mit den privaten IP-Adressen von * lamp01 * und * 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

Wiederholen Sie die Tests in * Schritt 4 *, um sicherzustellen, dass die Firewall unseren Datenverkehr nicht blockiert.