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.