Warum muss Unicorn zusammen mit Nginx bereitgestellt werden?

138

Ich würde gerne den Unterschied zwischen Nginx und Unicorn kennenlernen. Soweit ich weiß, ist Nginx ein Webserver, während Unicorn ein Ruby-HTTP-Server ist.

Da sowohl Nginx als auch Unicorn HTTP-Anforderungen verarbeiten können, muss die Kombination von Nginx und Unicorn für RoR-Anwendungen verwendet werden?

Loganathan
quelle
3
Gute Frage ! Ich denke, der Titel dieser Frage sollte lauten: "Warum wir die Kombination von Nginx und Einhorn brauchen .;) Die Antworten waren für mich sehr hilfreich.
servatj
1
@servatj Ich habe eine Antwort hinzugefügt, die ausführlicher erklärt, warum Unicorn einen Reverse-Proxy wie Nginx benötigt. Vielleicht möchten Sie es überprüfen;)
Agis

Antworten:

63

Nginx-
Geben Sie hier die Bildbeschreibung ein
Einhorn Weitere Informationen finden
Geben Sie hier die Bildbeschreibung ein
Sie unter Einhorn auf Github .

Pratik
quelle
1
Pratik, Was ist meine Frage: Einhornserver kann sowohl statischen als auch dynamischen Prozessen dienen. Warum verwenden wir dann NGinx oder Apache, die die einzigen statischen Inhalte verarbeiten können, kombiniert mit dem Passagier oder Einhorn oder mod_php?
Loganathan
17
@loganathan, Sowohl Apache als auch Nginx können statische Inhalte viel schneller bereitstellen als Ruby oder einer der Anwendungsserver. Sie wissen auch, wie man mit Caching umgeht, und sind gut darin, gleichzeitige Dateidownloads zuzulassen, während sie weiterhin Datenverkehr aufnehmen und an die Anwendungsserver weiterleiten.
Pratik
4
Wenn große Datenmengen kommen und gehen, puffert nginx diese vom Client (und leitet sie an den Client weiter). Ohne Nginx wird eines Ihrer Einhörner beim Upload / Download gefesselt.
BraveNewCurrency
10
Dies beantwortet nicht die Frage, warum Nginx überhaupt benötigt wird. Es fügt es einfach in beide Bilder ohne Kommentar ein. Nicks Antwort ist viel besser.
Gorn
1
Ich stimme @gorn zu. Das bedeutete mir zum Beispiel nichts.
BalinKingOfMoria CMs
94

Nginx ist ein reiner Webserver, der dazu dient, statischen Inhalt bereitzustellen und / oder die Anforderung an einen anderen Socket umzuleiten, um die Anforderung zu verarbeiten.

Unicorn ist ein Rack-Webserver und nur zum Hosten einer 'Rack-App' gedacht, die normalerweise dynamischen Inhalt generiert. Rack-Apps können auch statische Inhalte bereitstellen, sind jedoch weniger effizient als die meisten anderen herkömmlichen Webserver.

Die meisten RoR-Setups verwenden eine Kombination aus herkömmlichen Webservern und Rack-Servern, um das Beste aus beiden Funktionen herauszuholen. Nginx ist auf Anfrage unglaublich schnell, indem es Proxy-Balancing durchführt und statische Inhalte bereitstellt. Unicorn ist durchaus in der Lage, HTTP-Header zu verarbeiten und eingehende Anforderungen zur Verarbeitung an Ruby auszugleichen.

Nick
quelle
73

Diese Antwort ergänzt die anderen und erklärt, warum Unicorn Nginx davor benötigt .

TL; DR Der Grund, warum Unicorn normalerweise zusammen mit einem Reverse-Proxy wie Nginx bereitgestellt wird, liegt darin, dass seine Entwickler es absichtlich so entworfen haben, um der Einfachheit halber einen Kompromiss einzugehen.

Erstens hindert Sie nichts daran, Unicorn ohne einen Reverse-Proxy bereitzustellen. Das wäre jedoch keine sehr gute Idee; Mal sehen warum.

Unicorn folgt der Unix-Philosophie, die darin besteht, eines zu tun und es gut zu machen , nämlich schnelle Clients mit geringer Latenz zu bedienen (wir werden später sehen, was dies bedeutet). Die Tatsache, dass Unicorn für schnelle Clients mit geringer Latenz entwickelt wurde, impliziert auch, dass es mit langsamen Clients mit hoher Latenz nicht sehr gut ist , was in der Tat wahr ist. Dies ist eine der Schwachstellen von Unicorn, und hier kommt ein Reverse-Proxy ins Spiel: Er sitzt vor Unicorn und kümmert sich um diese langsamen Clients (wir werden später sehen, wie ).

Glücklicherweise existiert ein solcher Reverse-Proxy bereits und heißt Nginx .

Die Entscheidung, nur schnelle Clients zu verarbeiten, vereinfacht das Design von Unicorn erheblich und ermöglicht eine viel einfachere und kleinere Codebasis auf Kosten einer zusätzlichen Komplexität in der Bereitstellungsabteilung (dh Sie müssen neben Unicorn auch Nginx bereitstellen).

Eine alternative Entscheidung könnte darin bestehen, Unicorn so zu gestalten, dass kein Reverse-Proxy erforderlich ist. Dies bedeutet jedoch, dass zusätzliche Funktionen implementiert werden müssen, um alle Aufgaben von Nginx auszuführen, was zu einer komplexeren Codebasis und mehr Engineering-Aufwand führt.

Stattdessen entschieden sich die Entwickler, vorhandene Software zu nutzen, die kampferprobt und sehr gut gestaltet ist, und Zeit und Energie nicht für Probleme zu verschwenden, die bereits von anderer Software gelöst wurden.

Aber lassen Sie uns technisch werden und Ihre Frage beantworten:

Warum muss Unicorn zusammen mit Nginx bereitgestellt werden?

Hier sind einige der Hauptgründe:

Unicorn verwendet blockierende E / A für Clients

Unter Berufung auf einem Reverse - Proxy bedeutet , dass Unicorn nicht brauchen zu verwenden non-blocking I / O. Stattdessen können blockierende E / A verwendet werden, die für den Programmierer von Natur aus einfacher und leichter zu befolgen sind.

Auch wie im DESIGN- Dokument angegeben:

[Verwenden von blockierenden E / A] ermöglicht das Befolgen eines einfacheren Codepfads innerhalb des Ruby-Interpreters und weniger Systemaufrufe.

Dies hat jedoch auch einige Konsequenzen:

Schlüsselpunkt 1: Einhorn ist bei langsamen Clients nicht effizient

(Der Einfachheit halber nehmen wir ein Setup mit 1 Einhornarbeiter an.)

Da blockierende E / A verwendet werden, kann ein Unicorn-Mitarbeiter jeweils nur einen Client bedienen , sodass ein langsamer Client (dh einer mit einer langsamen Verbindung) den Mitarbeiter effektiv länger beschäftigt (als ein schneller Client) ). In der Zwischenzeit würden die anderen Clients nur warten, bis der Mitarbeiter wieder frei ist (dh Anfragen würden sich in der Warteschlange stapeln).

Um dieses Problem zu umgehen, wird vor Unicorn ein Reverse-Proxy bereitgestellt, der eingehende Anforderungen und  Anwendungsantworten vollständig puffert und sie dann sofort (auch als Löffel-Feeds bezeichnet) an Unicorn bzw. die Clients sendet  . In dieser Hinsicht könnte man sagen, dass der Reverse-Proxy Unicorn vor langsamen Netzwerk-Clients "schützt".

Glücklicherweise ist Nginx ein großartiger Kandidat für diese Rolle, da es dafür ausgelegt ist, Tausende von Hunderten gleichzeitiger Clients effizient zu verwalten.

Es ist von entscheidender Bedeutung, dass sich der Reverse-Proxy im selben lokalen Netzwerk wie Unicorn befindet (normalerweise auf demselben physischen Computer, der mit Unicorn über einen Unix-Domain-Socket kommuniziert), damit die Netzwerklatenz auf ein Minimum beschränkt bleibt.

Ein solcher Proxy spielt also effektiv die Rolle eines schnellen Clients  , für den Unicorn in erster Linie ausgelegt ist, da er Anfragen an Unicorn schnell weiterleitet und die Mitarbeiter so schnell wie möglich beschäftigt (im Vergleich zu der Zeit, die ein Client benötigt) mit einer langsamen Verbindung würde reichen).

Schlüsselpunkt 2: Unicorn unterstützt HTTP / 1.1 Keep-Alive nicht

Da Unicorn blockierende E / A verwendet, bedeutet dies auch, dass die HTTP / 1.1-Keep-Alive-Funktion nicht unterstützt werden kann, da die dauerhaften Verbindungen langsamer Clients schnell alle verfügbaren Unicorn-Mitarbeiter belegen würden.

Ratet mal, um HTTP Keep-Alive zu nutzen: Es wird ein Reverse-Proxy verwendet.

Nginx hingegen kann mit nur wenigen Threads Tausende von gleichzeitigen Verbindungen verarbeiten. Daher hat es nicht die Parallelitätsbeschränkungen, die ein Server wie Unicorn hat (was im Wesentlichen auf die Anzahl der Arbeitsprozesse beschränkt ist), was bedeutet, dass er beständige Verbindungen problemlos verarbeiten kann. Mehr darüber, wie das tatsächlich funktioniert, finden Sie hier .

Aus diesem Grund akzeptiert nginx Keep-Alive-Verbindungen von den Clients und überträgt sie über einfache Verbindungen über einen Unix-Socket an Unicorn.

Punkt 3: Unicorn ist nicht sehr gut darin, statische Dateien bereitzustellen

Auch hier kann Unicorn statische Dateien bereitstellen, ist jedoch nicht für eine effiziente Ausführung ausgelegt.

Auf der anderen Seite sind Reverse-Proxys wie Nginx jedoch viel besser darin (dh sendfile(2)& Caching).

Mehr

Es gibt weitere Punkte, die im PHILOSOPHY- Dokument beschrieben sind (siehe "Verbesserte Leistung durch Reverse Proxying" ).

Siehe auch einige der Grundfunktionen von nginx .

Wir sehen, dass Unicorn durch die Nutzung vorhandener Software (z. B. Nginx) und die Befolgung der Unix-Philosophie "eins tun und es gut machen" in der Lage ist, ein einfacheres Design und eine einfachere Implementierung zu verfolgen und gleichzeitig die Bereitstellung von Rack-Apps (z. Ihre Rails App).

Weitere Informationen finden Sie unter Unicorn Philosophie und Design - Dokumente , die die Entscheidungen hinter Unicorn Design näher erläutern und warum nginx ist ein gutes Reverse-Proxy für Unicorn betrachtet.

Agis
quelle
Aber warum nicht einfach Nginx verwenden? Ich glaube, er hat gefragt, nicht, warum Einhorn Nginx benötigt. Was bietet Unicorn zum Beispiel, was Nginx nicht bietet?
Omikes
3
@oMiKeY Wenn das der Fall ist, glaube ich, dass die anderen Antworten diese Frage ziemlich gut beantworten. Ich denke immer noch, dass meine Antwort nützliche Informationen für alle bietet, die versuchen, die Kombination von Nginx und Einhorn zu verstehen .
Agis
2
Das ist reines Gold. Danke dir!
Magne
14

Nginx kann verwendet werden, um langsame Clients auf einem Einhornserver zu bedienen, da langsame Clients den Einhornserver verstopfen würden. Nginx wird als eine Art Proxy verwendet, der alle Anforderungen und Antworten an langsame Clients puffert.

Siehe http://unicorn.bogomips.org/

Bardiir
quelle