UnicornをNginxと一緒に展開する必要があるのはなぜですか?


138

NginxとUnicornの違いを知りたいのですが。私が理解している限り、NginxはWebサーバーであり、UnicornはRuby HTTPサーバーです。

NginxとUnicornの両方がHTTPリクエストを処理できるため、RoRアプリケーションでNginxとUnicornの組み合わせを使用する必要性は何ですか?


3
良い質問 !私たちはnginxのとユニコーンの組み合わせを必要とするのはなぜこの質問のタイトルは」あるべきだと思う;)答えは私にとって非常に有用だった。。
servatj

1
@servatjユニコーンがその前にNginxのようなリバースプロキシを必要とする理由をより詳細に説明する回答を追加しました。あなたはそれをチェックアウトしたいかもしれません;)
アジス

回答:


62

Nginx
ここに画像の説明を入力してください
ユニコーン
ここに画像の説明を入力してください
詳細については、githubのユニコーンを参照してください。


1
Pratik、私の質問は何ですか?ユニコーンサーバーは静的および動的プロセスの両方を処理できますが、なぜNGinxまたはApacheを使用しているのですか?それらは、唯一の静的コンテンツを、passengerまたはunicornまたはmod_phpと組み合わせて処理できるのですか?
loganathan 2012年

17
@ loganathan、ApacheとNginxはどちらも、Rubyや他のアプリケーションサーバーよりも静的コンテンツの提供がはるかに高速です。また、キャッシングの処理方法を知っており、トラフィックを取り込んでアプリケーションサーバーに渡しながら、ファイルの同時ダウンロードを許可するのが得意です。
Pratik、2012年

4
また、大量のデータが送受信される場合、nginxはそれをクライアントから(およびクライアントへのスプーンフィードで)バッファリングします。nginxがないと、アップロード/ダウンロード中にユニコーンの1つが拘束されます。
BraveNewCurrency

10
これは、なぜnginxが必要なのかという質問には答えません。コメントなしで両方の画像に配置するだけです。ニックの答えははるかに優れています。
2014

1
@gornに同意します。たとえば、これは私には何の意味もありませんでした。
BalinKingOfMoriaのCMが2015

94

Nginxは、静的コンテンツを提供したり、リクエストを別のソケットにリダイレクトしてリクエストを処理したりすることを目的とした純粋なWebサーバーです。

UnicornはRack Webサーバーであり、通常は動的コンテンツを生成する「Rackアプリ」をホストすることのみを目的としています。Rackアプリは静的コンテンツを提供することもできますが、他のほとんどの従来のWebサーバーよりも効率が劣ります。

ほとんどのRoRセットアップでは、従来のWebサーバーとラックサーバーの両方の組み合わせを使用して、両方の機能の最良のものを適用します。Nginxは、プロキシバランシングと静的コンテンツの提供により、リクエストのリダイレクトで信じられないほど高速です。Unicornは、HTTPヘッダーを処理し、Rubyへの受信リクエストを処理するためにバランスをとることができます。


73

この回答は他の回答を補足するものであり、ユニコーンがその前にnginxを必要とする理由を説明しています。

TL; DR Unicornが通常nginxのようなリバースプロキシと一緒に展開される理由は、その作成者が故意に設計したものであり、単純化と引き換えにトレードオフを行うためです。

まず第一に、リバースプロキシなしで Unicorn 展開することを妨げるものは何もありません。しかし、それはあまり良い考えではありません。その理由を見てみましょう。

Unicornは、1つのことをうまく実行するというUnixの哲学に従っています。これは、高速で低レイテンシのクライアントにサービスを提供することです(これについては後で説明します)。Unicornが高速で低レイテンシのクライアント用に設計されているという事実は、低速で高レイテンシのクライアントにはあまり適していないことも意味しています。これはユニコーンの弱点の1つであり、リバースプロキシが機能する場所です。リバースプロキシはユニコーンの前に位置し、これらの遅いクライアントを処理します(後で説明します)。

幸い、このようなリバースプロキシは既に存在しており、nginxと呼ばれています。

高速なクライアントのみを処理するという決定により、Unicornの設計が大幅に簡素化され、コードベースがはるかにシンプルで小さくなりますが、展開部門の複雑さが増します(つまり、Unicornに加えてnginxも展開する必要があります)。

代替の決定は、リバースプロキシを必要としないような方法でユニコーンを設計することです。ただし、これは、nginxが実行するすべての処理を実行するために追加の機能を実装する必要があり、その結果、コードベースが複雑になり、エンジニアリングの労力が増えることを意味します。

代わりに、その作成者は、十分にテストされ、十分に設計された既存のソフトウェアを活用し、他のソフトウェアによって既に解決されている問題に時間とエネルギーを浪費しないように決定しました。

しかし、技術的になって、あなたの質問に答えましょう:

Unicornをnginxと一緒に展開する必要があるのはなぜですか?

主な理由は次のとおりです。

UnicornはクライアントにブロッキングI / Oを使用します

リバースプロキシに依存しているということは、ユニコーンがノンブロッキングI / Oを使用する必要がないことを意味します。代わりに、プログラマーが本質的に単純で簡単なブロックI / Oを使用できます。

また、設計ドキュメントには次のように記載されています。

[ブロッキングI / Oの使用]により、Rubyインタープリター内でたどるコードパスを簡素化し、syscallを減らすことができます。

ただし、これにはいくつかの影響もあります。

キーポイント#1:ユニコーンは遅いクライアントでは効率的ではない

(簡単にするために、ユニコーンワーカーが1人のセットアップを想定しています)

ブロッキングI / Oが使用されているため、Unicornワーカーは一度に1つのクライアントしか処理できません。そのため、遅いクライアント(つまり、接続が遅いクライアント)は、(速いクライアントが行うよりも)長時間にわたってワーカーをビジー状態に保ちます。 )。その間、他のクライアントはワーカーが再び解放されるまで待機します(つまり、リクエストがキューに蓄積されます)。

この問題を回避するために、ユニコーンの前にリバースプロキシが展開されます。リバースプロキシは、着信要求  アプリケーション応答を完全にバッファーし、それぞれを一度に(別名スプーンフィードで)ユニコーンとクライアントにそれぞれ送信  します。その点で、リバースプロキシはUnicornを低速のネットワーククライアントから「シールド」すると言えます。

幸い、Nginxは、何千もの数の同時クライアントを効率的に処理するように設計されているため、この役割の優れた候補です。

リバースプロキシがUnicornと同じローカルネットワーク内(通常、Unixドメインソケットを介してUnicornと通信する同じ物理マシン内)にあることが非常に重要です。これにより、ネットワーク遅延が最小限に抑えられます。

したがって、このようなプロキシは、 ユニコーンが最初にサービスを提供するように設計されている高速クライアントの役割を効果的に果たします。これは、ユニコーンへのリクエストを高速にプロキシし、ワーカーのビジー状態を可能な限り最短時間(クライアントの時間と比較して)にするためです。遅い接続では十分です)。

キーポイント#2:UnicornはHTTP / 1.1キープアライブをサポートしていません

ユニコーンはブロッキングI / Oを使用するため、遅いクライアントの永続的な接続は使用可能なすべてのユニコーンワーカーをすぐに占有するため、HTTP / 1.1キープアライブ機能をサポートできないことも意味します。

したがって、HTTPキープアライブを活用するには、リバースプロキシを使用する必要があります。

一方、nginxは、数スレッドのみを使用して数千の同時接続を処理できます。したがって、Unicornのようなサーバーの同時実行制限(ワーカープロセスの数に本質的に制限されている)はありません。つまり、永続的な接続を適切に処理できます。これが実際にどのように機能するかについては、こちらをご覧ください

そのため、nginxはクライアントからのキープアライブ接続を受け入れ、通常のUnixソケット経由のプレーン接続を介してそれらをUnicornにプロキシします。

ポイント#3:ユニコーンは静的ファイルの提供があまり得意ではない

繰り返しますが、静的ファイルの提供はUnicorn 実行できることですが、効率的に実行するようには設計されていません。

一方、nginxのようなリバースプロキシは、はるかに優れています(つまり、sendfile(2)キャッシュ)。

もっと

PHILOSOPHYドキュメントで概説されている他のポイントがあります(「リバースプロキシによるパフォーマンスの向上」を参照)。

nginxの基本機能の一部もご覧ください。

Unicornは、既存のソフトウェア(nginx)を活用し、Unixの「1つのことをうまく実行する」という哲学に従って、ラックアプリ(例: Railsアプリ)。

詳細については、Unicornの設計の背後にある選択、およびnginxがUnicornの優れたリバースプロキシと見なされる理由をより詳細に説明するUnicornの哲学および設計ドキュメントを参照してください。


しかし、なぜNginxを使用するだけでなく、なぜユニコーンがnginxを必要とするのかではなく、彼が尋ねていたと思います。たとえば、UnicornはNginxが提供しないものを何に提供しますか?
省略

3
@oMiKeYその場合、私は他の答えがこの質問にかなり良いと信じています。私の答えは、nginxとユニコーンの組み合わせを理解しようとしている人に役立つ情報を提供すると私はまだ思います。
Agis

2
これは純金です。ありがとうございました!
マグネ

14

Nginxは、遅いクライアントがユニコーンサーバーを窒息させるので、ユニコーンサーバー上の遅いクライアントにサービスを提供するために使用できます。Nginxは、遅いクライアントへのすべての要求と応答をバッファリングする何らかのプロキシとして使用されます。

http://unicorn.bogomips.org/を参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.