Detaillierte Erläuterung der Fallstricke des Nginx-Proxy-Socket.io-Dienstes

Detaillierte Erläuterung der Fallstricke des Nginx-Proxy-Socket.io-Dienstes

Nginx fungiert als Proxy für zwei socket.io-Server. Der Arbeitsmodus von socket.io ist Polling und wurde auf WebSocket aktualisiert.

Phänomen

Beim Anfordern von Diensten über nginx traten zahlreiche 400-Fehler auf. Manchmal konnten sie auf WebSocket aktualisiert werden, und manchmal meldeten sie weiterhin Fehler. Aber beim direkten Zugriff über ip+端口ist die Erfolgsquote 100 %.

analysieren

Seite

SID ist der Schlüssel zu unserem Problem. Beim ersten Herstellen einer Verbindung (der Polling-Modus simuliert eine lange Verbindung) initiiert der Client eine Anfrage wie diese:

https://***/?EIO=3&transport=polling&t=1540820717277-0

Nach Erhalt der Nachricht erstellt der Server ein Objekt, bindet es an die Verbindung und gibt eine SID (Sitzungs-ID) zurück, um die Sitzung zu markieren. Was bedeutet eine Sitzung? Eine Sitzung ist eine Reihe von Interaktionen, und diese Interaktionen sind miteinander verknüpft. In unserem Szenario muss ich bei der nächsten HTTP-Anforderung das Objekt finden, das zuvor an die theoretisch lange Verbindung gebunden war (hier gibt es keinen WebSocket, es ist also theoretisch). Wir wissen, dass HTTP-Anfragen zustandslos sind und jede Anfrage unabhängig ist, daher führt socket.io zu diesem Zweck SID ein. Nach Erhalt der Anfrage generiert der Server eine SID und sieht sich die Antwort an:

Kopieren Sie den Code wie folgt:
{"sid":"EoGaL3fRQlpTOaLp5eST","upgrades":["websocket"],"pingInterval":8000,"pingTimeout":10000}

Jede nachfolgende Anfrage muss diese SID enthalten, einschließlich der Anfrage zum Erstellen einer WebSocket-Anfrage. Daher ist Sid der Schlüssel zum Polling und zum Upgraden des Pollings auf Websocket. Die Anfrage danach sieht folgendermaßen aus:

https://***/?EIO=3&transport=polling&t=1540820717314-1&sid=EoGaL3fRQlpTOaLp5eST

oder

wss://***/?EIO=3&transport=websocket&t=1540820717314-1&sid=EoGaL3fRQlpTOaLp5eST

Die Frage ist also, was passiert, wenn die in der Anforderung enthaltene SID nicht vom Server generiert wird? Der Server erkennt es nicht und gibt eine 400 zurück und sagt Ihnen

ungültige Seite

Dies ist das Problem, auf das wir gestoßen sind. Die standardmäßige Lastausgleichsstrategie von nginx ist Polling, sodass die Anforderung möglicherweise auf einem Computer eintrifft, der nicht derjenige ist, der die SID generiert hat. Zu diesem Zeitpunkt erhalten wir eine 400. Wenn wir Glück haben, kann sie auch auf dem ursprünglichen Computer eintreffen. Wenn wir mehr Glück haben, können wir sogar so lange weitermachen, bis die WebSocket-Verbindung hergestellt ist.

lösen

Hier sind zwei Lösungen

  1. Nginx verwendet ip_hash zum Lastenausgleich, wodurch sichergestellt wird, dass alle Anfragen eines Clients an einen Server gehen.
  2. Verwenden Sie keinen Polling-Modus, sondern nur WebSocket

Beide Optionen haben ihre Vor- und Nachteile. Der zweite Grund liegt auf der Hand: Alte Browser und Clients, die WebSockets nicht unterstützen, funktionieren nicht. Das erste Problem ist eher versteckt. Stellen Sie sich vor, was passieren würde, wenn Sie Maschinen hinzufügen oder entfernen würden. In diesem Moment würde sich das Modell der ip_hash-Strategie ändern und alle vorherigen Verbindungen würden ungültig. Bei Microservices ist die Skalierung jedoch ein sehr häufiger Vorgang (insbesondere, wenn sich das Produkt in der Entwicklungsphase befindet), und diese verlustbehaftete Skalierung ist höchstwahrscheinlich nicht akzeptabel.

Zusammenfassend wird empfohlen, WebSocket direkt zu verwenden. Schließlich machen die alten Versionen, die WebSocket nicht unterstützen, einen kleinen Anteil aus und es dauert weniger Zeit, als zuerst abzufragen.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung der Nginx Reverse Proxy WebSocket-Konfiguration
  • Detaillierte Erklärung der Lösung für die Nginx Reverse Proxy WebSocket-Antwort 403
  • Nginx tatsächliches Kampf-Reverse-Proxy-WebSocket-Konfigurationsbeispiel
  • Tutorial zur Verwendung von Nginx als WebSocket-Proxy
  • Nginx Reverse Proxy WebSocket-Konfigurationsbeispiel

<<:  Vue SPA-Lösung zur Optimierung des ersten Bildschirms

>>:  Beheben Sie das Fehlerproblem, das durch die Änderung von MySQL data_dir verursacht wird

Artikel empfehlen

Zusammenfassung der Probleme bei der Installation von MySQL 5.7.19 unter Linux

Als ich MySQL zum ersten Mal auf meiner virtuelle...

So verbinden Sie Django 2.2 mit einer MySQL-Datenbank

1. Beim Ausführen des Projekts werden folgende Fe...

Aktualisierungen für React Router V6

Inhaltsverzeichnis ReactRouterV6-Änderungen 1. &l...

Verwenden des radialen Farbverlaufs in CSS zum Erzielen eines Karteneffekts

Vor einigen Tagen erhielt eine Kollegin ein Punkt...

Installieren Sie Mininet aus dem Quellcode auf Ubuntu 16.04

Mininet Mininet ist eine leichtgewichtige, softwa...

Details zum MySQL-Datentyp

Inhaltsverzeichnis 1. Numerischer Typ 1.1 Klassif...

Implementierung der Änderung von Konfigurationsdateien im Docker-Container

1. Betreten Sie den Container docker run [Option]...

So erstellen Sie mit Docker von Grund auf ein persönliches SOLO-Blog

Inhaltsverzeichnis 1. Umweltvorbereitung 2. Docke...

Neue Funktionen von JS ES: Einführung in Erweiterungsoperatoren

1. Spread-Operator Der Spread-Operator besteht au...

HTML-Elemente (Tags) und ihre Verwendung

a : Gibt die Start- oder Zielposition eines Hyper...