Lösen Sie das Sitzungsfreigabeproblem des Nginx-Lastausgleichs

WBOY
Freigeben: 2016-07-29 09:15:43
Original
848 Leute haben es durchsucht

Ich habe einige Informationen überprüft und einige von anderen geschriebene Dokumente gelesen. Die Zusammenfassung lautet wie folgt, um die gemeinsame Nutzung von Nginx-Sitzungen zu realisieren.

Es gibt mehrere PHP-Server und Nginx wird für den Lastausgleich verwendet Dieselbe IP kann auf dieselbe Seite zugreifen. Wenn die Sitzung nicht synchronisiert ist, treten viele Probleme auf, z. B. der häufigste Anmeldestatus. Hier gibt es mehrere Möglichkeiten, das Problem der Sitzungsfreigabe zu lösen >

1. Verwenden Sie anstelle der Sitzung ein Cookie

Die Sitzung wird auf der Serverseite gespeichert, und das Cookie wird auf der Clientseite gespeichert. Wir können die durch den Zugriff des Benutzers auf die Seite generierte Sitzung ablegen das Cookie, welches das Cookie als Übergabestation nutzen soll. Sie besuchen Webserver A, generieren eine Sitzung und legen sie in einem Cookie ab. Wenn Ihre Anfrage Server B zugewiesen wird, stellt Server B zunächst fest, ob der Server über die Sitzung verfügt. Wenn nicht, überprüft er das Cookie des Clients Eine solche Sitzung bedeutet, dass die Sitzung tatsächlich nicht vorhanden ist. Wenn eine Sitzung im Cookie vorhanden ist, synchronisieren Sie die Sitzung im Cookie mit Server B, damit die Sitzung synchronisiert werden kann.

Hinweis: Diese Methode ist einfach und bequem zu implementieren und erhöht die Belastung der Datenbank nicht. Wenn der Client jedoch Cookies deaktiviert, wird die Sitzung nicht synchronisiert, was zu Problemen auf der Website führt. Verlust; die Sicherheit von Cookies ist nicht hoch, obwohl sie verschlüsselt wurden, können sie dennoch gefälscht werden.

2. Die Sitzung wird in der Datenbank gespeichert (MySQL usw.)

PHP kann so konfiguriert werden, dass die Sitzung in der Datenbank gespeichert wird mit anderen Datenbanktabellen Wenn MySQL ebenfalls geclustert ist, muss jeder MySQL-Knoten über diese Tabelle verfügen und die Datentabelle dieser Sitzungstabelle muss in Echtzeit synchronisiert werden.

Hinweis: Die Verwendung einer Datenbank zum Synchronisieren von Sitzungen erhöht die E/A der Datenbank und erhöht die Belastung der Datenbank. Darüber hinaus ist die Lese- und Schreibgeschwindigkeit der Datenbank langsam, was einer zeitnahen Synchronisierung von Sitzungen nicht förderlich ist.

3. Die Sitzung wird in Memcache oder Redis gespeichert.

Die Speichermethode ist in der PHP-Konfigurationsdatei auf Memcache eingestellt, sodass PHP selbst einen Sitzungscluster erstellt Speichern Sie die Sitzungsdaten im Memcache.

Hinweis: Die Synchronisierung der Sitzung auf diese Weise erhöht die Belastung der Datenbank nicht und die Sicherheit wird im Vergleich zur Verwendung von Cookies erheblich verbessert. Das Speichern der Sitzung im Speicher erfolgt viel schneller als das Lesen aus der Datei. Allerdings unterteilt Memcache den Speicher in Speicherblöcke mit vielen Spezifikationen, und jeder Block hat seine eigene Größe. Diese Methode bestimmt auch, dass Memcache den Speicher nicht vollständig nutzen kann und zu einer Speicherfragmentierung führt .

4. Die ip_hash-Technologie in nginx kann die Anforderung einer bestimmten IP an dasselbe Backend weiterleiten, sodass ein bestimmter Client und ein bestimmtes Backend unter dieser IP eine stabile Sitzung aufbauen können. ip_hash wird im Upstream definiert Konfiguration:

  1. stream nginx.example.com
  2. { server 192.168.74.235:80;
  3. server 192.168.74.236:80;
  4. ip_hash;
  5. Server 
  6.  { 
  7.  listen 8 0;
  8. Standort /
  9. {
  10. Proxy _pass
  11. http ://nginx.example.com
  12. }
  13. }
  14. ip_hash ist einfach Verständlich, aber weil nur der IP-Faktor zur Zuweisung von Backends verwendet werden kann, ip_hash ist defekt und kann in manchen Situationen nicht verwendet werden: 1.nginx ist nicht der Front-End-Server.
ip_hash erfordert, dass Nginx der Front-End-Server ist. Andernfalls kann Nginx nicht die richtige IP erhalten und kann keinen Hash basierend auf der IP durchführen. Wenn beispielsweise Squid als Frontend verwendet wird, kann Nginx beim Abrufen der IP nur die Server-IP-Adresse von Squid abrufen. Es ist definitiv verwirrend, diese Adresse für die Verteilung zu verwenden.

2. Das Backend von Nginx verfügt auch über andere Methoden zum Lastausgleich.

Wenn im Nginx-Backend ein anderer Lastausgleich stattfindet und die Anfragen auf andere Weise umgeleitet werden, dann wird eine Anfrage eines bestimmten Clients definitiv nicht auf demselben Sitzungsanwendungsserver liegen. Bei dieser Berechnung kann das Nginx-Backend nur direkt auf den Anwendungsserver verweisen oder einen Squid erstellen und dann auf den Anwendungsserver verweisen. Der beste Weg besteht darin, den Standort als Umleitung zu nutzen, einige Anfragen, die eine Sitzung erfordern, über ip_hash umzuleiten und für den Rest zu anderen Backends zu gehen.

5. upstream_hash
Um einige Probleme von ip_hash zu lösen, können Sie das Modul upstream_hash eines Drittanbieters verwenden. Dieses Modul wird in den meisten Fällen als url_hash verwendet, verhindert jedoch nicht die Verwendung für die Sitzungsfreigabe. Ich habe es nicht ausprobiert und verstehe es wirklich nicht

Ergänzung: Eine kurze Einführung in Memcached

1. Konzept

Memcached ist ein von Danga entwickeltes Set. com (das technische Team, das LiveJournal betreibt) Verteiltes Speicherobjekt-Caching-System, das zur Reduzierung der Datenbanklast und zur Verbesserung der Leistung in dynamischen Systemen verwendet wird.

2. Anwendbare Anlässe

1. Da Memcached selbst auf einem verteilten System basiert, eignet es sich besonders für große verteilte Systeme.

2. Datenbank-Frontend-Cache. Datenbanken sind oft der Flaschenhals von Website-Systemen. Große gleichzeitige Zugriffe auf die Datenbank führen häufig zu einem Überlauf des Website-Speichers. Natürlich können wir auch den Caching-Mechanismus von Hibernate nutzen. Memcached basiert jedoch auf der Verteilung und kann unabhängig von der Website-Anwendung selbst sein, sodass es für große Websites besser geeignet ist, Anwendungen aufzuteilen.

3. Datenaustausch zwischen Servern. Beispielsweise teilen wir das Anmeldesystem und das Abfragesystem der Website in zwei Anwendungen auf, platzieren sie auf verschiedenen Servern und gruppieren sie. Wie werden dann die Anmeldeinformationen vom Anmeldesystemserver mit dem Abfragesystem synchronisiert, nachdem sich der Benutzer angemeldet hat? Server? Wolltuch? Zu diesem Zeitpunkt können wir memcached verwenden. Das Anmeldesystem speichert die Anmeldeinformationen zwischen, und das Abfragesystem kann die Anmeldeinformationen abrufen, genau wie beim Abrufen lokaler Informationen.

3. Unzutreffende Anlässe

Für Anwendungen, die keine „Verteilung“ erfordern, keine gemeinsame Nutzung erfordern oder einfach klein genug sind, um nur einen Server zu haben, bringt Memcached keine Vorteile im Gegenteil, es wird die Systemeffizienz verlangsamen, da die Netzwerkverbindung auch Ressourcen erfordert

Lösung: Verwenden Sie Memcached als Sitzungsspeicher und der Memcached-Server ist auf demselben Linux-Host wie Nginx eingestellt.

Lösungsprozess,

Die Host-IPs der beiden Apache sind 192.168.74.235192.168.74.236

Die Nginx-Host-IP ist 192.168.74.131

Memcached Die IP des Hosts lautet 192.168.74.131

Installieren Sie Memcached unter 192.168.74.131 und starten Sie

Nehmen Sie als Beispiel 192.168.74.236, installieren Sie PHP und die PHP-Abhängigkeitsbibliothek auf Memcached yuminstall memcached -devel .i686 libmemcached-devel.i686 php-pecl-memcache.i686

php.ini konfigurieren

session.save_handler= memcache

session.save_path= "tcp: // 192.168.74.131:11211"

Oder (die folgenden beiden wurden nicht ausprobiert)

1. .htaccess in einem bestimmten Verzeichnis:

php_value session.save_handler " memcache“
php_value session.save_path „tcp://IP:11211“

2. In einer bestimmten Anwendung:

ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://IP:11211");

Kommentieren Sie gleichzeitig Folgendes aus:session.save_path= "/var/lib /php/session“

Gleichzeitig öffnen Sie extension=memcache.so

Starten Sie Apache neu und überprüfen Sie die „Registrierten Speicherhandler“ in phpinfo. Diese drei werden „files usermemcache“ sein Wenn dies der Fall ist, beweisen Sie, dass sie installiert sind > # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM

Fügen Sie die folgende PHP-Datei auf dem 236-Computer hinzu

session_start();

if (!isset($_SESSION['TEST'])) {

$_SESSION['TEST'] = time();

}

$_SESSION ['TEST3'] = time();

print $_SESSION['TEST'];

print "

";

print $_SESSION['TEST3'];

print "

";

print session_id();

?>

Gehen Sie dann zum Memcached-Server und führen Sie

[root@Git ~]# memcached-tool127.0.0.1:11211

# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM

1 80B 0s 1                                                          0

Dies sollte es Ihnen ermöglichen, die Sitzung auf den zwischengespeicherten Server zu schreiben.

Zusammenfassend:

1. Firewall-Probleme, viele Fehler beim Herstellen einer Verbindung zu LAN-Servern werden durch Firewalls verursacht.

2. Die Abhängigkeiten sind nicht installiert und Memcached schlägt immer zu Beginn fehl, weil ich keine Erweiterungsbibliothek wie PHP installiert habe -memcached

Das Obige stellt vor, wie das Sitzungsfreigabeproblem des Nginx-Lastausgleichs gelöst werden kann, einschließlich des Inhalts. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!