Erklären Sie Load-Balancing mit Nginx, als wäre ich fünf

Erklären Sie Load-Balancing mit Nginx, als wäre ich fünf

Ich habe zahlreiche DIY-Beiträge und Tutorials zum Konfigurieren von Nginx als Load Balancer mithilfe eines Upstream-Servers gefunden:

upstream backend  {
  ip_hash;
  server 1.2.3.4;
  server 1.2.3.5;
  server 1.2.3.6;
}

server {
  location / {
    proxy_pass  http://backend;
  }
}

Aber das ist alles, was ich zur Konfiguration dieser Architektur finden kann. Derzeit habe ich eine Rails-Anwendung auf 3 Backend-VPS-Servern bereitgestellt und verwende Unicorn als HTTP-Server. Muss ich Ruby zusammen mit meiner Rails-Anwendung und Unicorn auch auf meinem Lastausgleichsserver installieren? Muss Nginx auf jedem der Upstream-Server installiert sein? Wenn ja, wie konfiguriere ich sie? Wenn ich etwas wie Varnish in die Architektur einführe, wo kommt das hin? Vor den Lastausgleich oder vor jedes der Backends?

Hier ist eine visuelle Darstellung, wie ich alles organisiert habe:

                                       +---> backend1 <---+
                                       |                  |
[requests] <---> [Nginx load-balancer]-+---> backend2 <---+-[Database server]
                                       |                  |
                                       +---> backend3 <---+

Antwort1

Kurze Antwort:

Nginxhat eigentlich nur eine Aufgabe, und diese Aufgabe besteht darin, eine eingehende Anfrage anzunehmen und sie an einen Backend-Server weiterzuleiten.

In diesem Fall müssen Ihre Front-End-Server nur ausgeführt werden nginxund Ihre Back-End-Server nur rails. Ergibt das Sinn?

Wenn Ihr Backend und Frontend beide auf demselben Server laufen, dann müsste es natürlich auch dort installiert werden, aber Ihrem Diagramm zufolge glaube ich nicht, dass das der Fall ist.

Wenn Sie eine HTTP-Caching-Software wie einführen, Varnishwürde diese zwischen Nginxund wechseln und Railshöchstwahrscheinlich auch auf dem Backend-Server ausgeführt werden. Anfragen würden also diesem Pfad folgen:

Nqinx -> Varnish -> Rails

Antwort2

Bei der Arbeit mit Rails nginxkann es für verschiedene Aufgaben verwendet werden, am häufigsten als HTTP-Load Balancer oder als Frontend für App-Server. Ihr Setup ist ein gängiges, das funktioniert, aber bei steigendem Datenverkehr Skalierungsprobleme mit sich bringen kann.

Wenn Sie wie beschrieben mit einer Handvoll VPS-Servern arbeiten, kann eine Nginx-Instanz sowohl als primärer HTTP-Load Balancer für eingehenden Datenverkehr als auch als Front-End zum Auslagern von Low-Level-Aufgaben von den Rails-App-Servern (Bereitstellen statischer Dateien, URL-Umschreiben/-Weiterleitungen usw.) dienen.

nginx kann viele tausend gleichzeitige Verbindungen ohne viele Ressourcen verarbeiten, während Unicorn Rails-App-Server normalerweise nur eine Handvoll gleichzeitiger Verbindungen bedienen können. Wenn Sie weiter skalieren, benötigen Sie mehr Load Balancer/Front-End-nginx-Instanzen (und eine Methode zum Lastenausgleich zwischen ihnen, wie DNS-Round-Robin oder andere Mechanismen).

Wenn Sie Amazon AWS oder andere ausgereiftere Hosting-Plattformen verwenden, wird häufig ein Dienst wie Elastic Load Balancing (ELB) als primärer Web-Load Balancer verwendet. Jeder App-Server führt nginx/Unicorn aus und verwendet nginx als Front-End, um die Verarbeitung von jedem Unicorn zu entlasten. Dies lässt sich aufgrund des ELB mit hohem Volumen vor jedem Server viel einfacher skalieren.

verwandte Informationen