注文:1. nginx 2.ワニス3. haproxy 4. webserver?


50

これらのすべてをフローで組み合わせることを推奨する人がいますが、多くの重複する機能があるようですので、実際のWebサーバーにアクセスする前に3つの異なるプログラムを通過させたい理由を掘り下げたいと思います。

nginx:

  • ssl:はい
  • 圧縮:はい
  • キャッシュ:はい
  • バックエンドプール:はい

ワニス:

  • ssl:no(トンネル?)
  • 圧縮:?
  • キャッシュ:はい(主な機能)
  • バックエンドプール:はい

haproxy:

  • ssl:no(トンネル)
  • 圧縮:?
  • キャッシュ:いいえ
  • バックエンドプール:はい(主な機能)

主な機能の利点の一部を得るためだけに、これらすべてをメインWebサーバーの前にチェーン化する意図はありますか?

非常に多くのデーモンが同じようなことを一緒にストリームするのは非常に壊れやすいようです。

展開と注文の優先順位とその理由は何ですか?


1
ニスは現在、SSLをサポートしている:参照blog.exceliance.fr/2012/09/10/...
MiniQuark

4
HAProxyと言ってもいいですか?
ルイスロボボロビア

Nginxにはすべてのものがあるように思えるので、nginxを使用するだけです。
スンオセワ14

回答:


60

簡単に言えば..

HaProxyは、市場で最高のオープンソースロードバランサーです。
Varnishは、市場で最高のオープンソースの静的ファイルキャッシュです。
Nginxは、市場で最高のオープンソースWebサーバーです。

(もちろんこれは私と他の多くの人々の意見です)

しかし、一般的に、すべてのクエリがスタック全体を通過するわけではありません。

すべてがhaproxyとnginx / multiple nginxを通過します。
唯一の違いは、静的リクエストのニスを「ボルト」で固定することです。

  • リクエストは冗長性とスループットのために負荷分散されます(良い、スケーラブルな冗長性)
  • 静的ファイルに対する要求は、最初にニスキャッシュにヒットします(高速で高速です)。
  • 動的リクエストはバックエンドに直接送られます(素晴らしい、ワニスは使用されません)

全体的に、このモデルはスケーラブルで成長中のアーキテクチャに適合します(複数のサーバーがない場合はhaproxyを使用します)

これが役立つことを願っています:D

注:実際にPound for SSLクエリも導入し
ます:D


1
非常に興味深い、特に復号化サーバーに関する部分。+1
ジェリー

素晴らしい答え。すべての前に何が座っているのだろうか?HAProxyまたはNginxですか?
ジョン

2
@John:[クライアント-> HAProxy->ワニス-> Nginx->静的コンテンツ]または[クライアント-> HAProxy-> Nginx(オプション)->アプリケーションサーバー(動的コンテンツ)]
MiniQuark

2
なぜ静的にキャッシュし、動的に提供するのですか?Nginxは、静的ファイルを提供するために非常に高速です。静的に[ HAProxy-> Nginx]のようなスタックを使用し、動的にキャッシュを実装するために[ HAProxy-> Nginx-> Varnish-> Apache]のようなスタックを使用することを好みます。専用の終端ノードで説明したように、ロードバランサーでSSLを終端します。
スティーブブゾナス

33

序文

2016年に更新します。状況は進化しており、すべてのサーバーは改善されており、すべてがSSLをサポートしており、Webはこれまで以上に素晴らしいものになっています。

特に明記しない限り、以下はビジネスおよび新興企業の専門家を対象としており、数千から数百万のユーザーをサポートしています。

これらのツールとアーキテクチャには、多くのユーザー/ハードウェア/お金が必要です。これを自宅のラボで試すことも、ブログを運営することもできますが、それはあまり意味がありません。

原則として、シンプル保ちたいことを忘れないでください。追加されるすべてのミドルウェアは、維持する必要があるミドルウェアの別の重要な部分です。追加するものが何もないとき、削除するものが残っていないとき、完全性は達成されません。

いくつかの一般的で興味深い展開

HAProxy(バランシング)+ nginx(PHPアプリケーション+キャッシング)

Webサーバーはphpを実行しているnginxです。nginxが既に存在する場合、キャッシュとリダイレクトも処理する可能性があります。

HAProxy ---> nginx-php
A       ---> nginx-php
P       ---> nginx-php
r       ---> nginx-php
o       ---> nginx-php
x       ---> nginx-php
y       ---> nginx-php

HAProxy(バランシング)+ Varnish(キャッシング)+ Tomcat(Javaアプリケーション)

HAProxyは、リクエストURI(* .jpg * .css * .js)に基づいてVarnishにリダイレクトできます。

HAProxy ---> tomcat
A       ---> tomcat
        ---> tomcat
P       ---> tomcat <----+
r       ---> tomcat <---+|
o                       ||
x       ---> varnish <--+|
y       ---> varnish <---+

HAProxy(バランシング)+ nginx(ホストおよびキャッシュへのSSL)+ Webサーバー(アプリケーション)

誰もがSSLを話さなければならない場合でも、WebサーバーはSSLを話せません(特に、このHAProxy-WebServerリンクはプライベートユーザー情報とEC2を通過します)。ローカルnginxを追加すると、ホストまでSSLを起動できます。nginxがあれば、キャッシュとURLの書き換えを行うこともできます。

:ポートリダイレクト443:8080は発生していますが、機能の一部ではありません。ポートのリダイレクトを行う意味はありません。ロードバランサーはwebserver:8080と直接対話できます。

          (nginx + webserver on same host)
HAProxy ---> nginx:443 -> webserver:8080
A       ---> nginx:443 -> webserver:8080
P       ---> nginx:443 -> webserver:8080
r       ---> nginx:443 -> webserver:8080
o       ---> nginx:443 -> webserver:8080
x       ---> nginx:443 -> webserver:8080
y       ---> nginx:443 -> webserver:8080

ミドルウェア

HAProxy:ロードバランサー

主な特長

  • 負荷分散(TCP、HTTP、HTTPS)
  • 複数のアルゴリズム(ラウンドロビン、ソースIP、ヘッダー)
  • セッション持続性
  • SSL終了

同様の選択肢:nginx(ロードバランサーとして構成可能な多目的Webサーバー)
さまざまな選択肢:クラウド(Amazon ELB、Googleロードバランサー)、ハードウェア(F5、フォーティネット、citrixネットスケーラー)、その他&世界全体(DNS、エニーキャスト、CloudFlare)

HAProxyは何をし、いつ使用する必要がありますか?
負荷分散が必要なときはいつでも。HAProxyはgo toソリューションです。

非常に安いか、早くて汚いか、スキルがない場合を除き、ELBを使用できます:D

銀行/政府/同様の状況で、ハード要件のある独自のデータセンターを使用する必要がある場合を除きます(専用インフラストラクチャ、信頼できるフェイルオーバー、2層のファイアウォール、監査スタッフ、ダウンタイム1分あたりx%を支払うSLA、すべて1) 30台のアプリケーションサーバーを含むラックの上部に2つのF5を配置できます。

100k HTTP(S)[およびマルチサイト]を通過する場合を除き、それらの前に[グローバル]負荷分散の層(cloudflare、DNS、エニーキャスト)を持つHAProxyを複数持つ必要があります。理論的には、グローバルバランサーはWebサーバーと直接通信してHAProxyを捨てることができます。ただし、通常、データセンターへのパブリックエントリポイントとしてHAProxyを保持し、ホスト間で公平にバランスを取り、分散を最小限に抑えるために高度なオプションを調整する必要があります。

個人的な意見:ひとつの真の目的に完全に専念する、小規模で、オープンなオープンソースプロジェクト。最も簡単な構成(1ファイル)の中で、私が人生で出会った中で最も有用で信頼性の高いオープンソースソフトウェアです。

Nginx:吸わないApache

主な特長

  • WebServer HTTPまたはHTTPS
  • CGI / PHP /その他でアプリケーションを実行する
  • URLリダイレクト/書き換え
  • アクセス制御
  • HTTPヘッダーの操作
  • キャッシング
  • 逆プロキシ

同様の代替案:Apache、Lighttpd、Tomcat、Gunicorn ...

Apacheは事実上のWebサーバーでありhttpd.conf、壊れたリクエスト処理アーキテクチャの上にある数十のモジュールと数千の行の巨大なクラスターファックとしても知られています。nginxは、これらすべてを、少ないモジュールで(わずかに)簡単な構成と優れたコアアーキテクチャでやり直しました。

nginxは何をし、いつ使用する必要がありますか?
Webサーバーは、アプリケーションを実行するためのものです。アプリケーションがnginxで実行するように開発されたとき、nginxが既にあり、すべての機能を使用することもできます。

アプリケーションがnginxで実行されることを意図しておらず、nginxがスタックのどこにも見つからない場合(Javaショップの誰か?)を除いて、nginxにはほとんど意味がありません。Webサーバー機能は現在のWebサーバーに存在する可能性が高く、他のタスクは適切な専用ツール(HAProxy / Varnish / CDN)により適切に処理されます。

除き(Gunicorn誰を?)あなたのウェブサーバ/アプリケーション、構成するハードの機能を、欠けている、および/またはあなたがそれを見てではなく、ダイの仕事をしたい、あなたはURLを実行する(各ノード上すなわちローカル)前にnginxのを置いてもよいとき書き換え、301リダイレクトの送信、アクセス制御の実施、SSL暗号化の提供、HTTPヘッダーのオンザフライ編集を行います。[これらはウェブサーバーに期待される機能です]

ニス:キャッシングサーバー

主な特長

  • キャッシング
  • 高度なキャッシング
  • 細粒度キャッシング
  • キャッシング

同様の選択肢:nginx(キャッシュサーバーとして構成可能な多目的Webサーバー)
さまざまな選択肢:CDN(Akamai、Amazon CloudFront、CloudFlare)、ハードウェア(F5、Fortinet、Citrix Netscaler)

Varnishは何をし、いつ使用する必要がありますか?
キャッシングのみを行います。通常、努力する価値はなく、時間の無駄です。代わりにCDNを試してください。キャッシングは、Webサイトを実行する際に最後に気をつけなければならないことに注意してください。

写真やビデオに関するウェブサイトを独占的に運営している場合を除き、CDNを徹底的に調べ、キャッシュについて真剣に検討する必要があります。

独自のデータセンターで独自のハードウェアの使用を余儀なくされ(CDNはオプションではない)、静的ファイルの配信がWebサーバーでひどい場合(Webサーバーの追加が役に立たない場合)を除き、Varnishは最後の手段です。

ほぼ静的、まだ複雑、動的に生成されたコンテンツ(次の段落を参照)を持つサイトがある場合を除き、VarnishはWebサーバーの処理能力を大幅に節約できます。

静的キャッシュは2016年に過大評価されています

キャッシングはほとんど構成不要で、無料で、時間もかかりません。CloudFlare、CloudFront、Akamai、MaxCDNに登録するだけです。この行を書くのにかかる時間は、キャッシュのセットアップにかかる時間よりも長く、手に持っているビールはCloudFlareサブスクリプションの中央値よりも高価です。

これらのサービスはすべて、静的* .css * .js * .pngなどの場合にそのまま使用できます。実際、彼らは主Cache-ControlにHTTPヘッダーのディレクティブを尊重します。キャッシュの最初のステップは、適切なキャッシュディレクティブを送信するようにWebサーバーを構成することです。どのCDN、どのVarnish、どのブラウザが中間にあるかは関係ありません。

パフォーマンスに関する考慮事項

Varnishは、平均的なWebサーバーがブログで猫の写真を配信するのを窒息させていたときに作成されました。最近では、平均的な最新のマルチスレッド非同期流行語駆動型Webサーバーの単一インスタンスが、子猫を確実に全国に配信できます。の礼儀sendfile()

私が取り組んだ最後のプロジェクトのいくつかの簡単なパフォーマンステストを行いました。単一のTomcatインスタンスは、HTTP経由で毎秒21 000〜33 000の静的ファイルを処理できます(さまざまなHTTP /クライアント接続カウントで20B〜12kBのファイルをテストします)。持続的なアウトバウンドトラフィックは2.4 Gb / sを超えています。本番環境では、1 Gb / sのインターフェイスのみが使用されます。ハードウェアよりも良いことはできません。ワニスを試しても意味がありません。

複雑な変化する動的コンテンツのキャッシュ

CDNおよびキャッシングサーバーは通常、などのパラメーターを持つURLを?article=1843無視し、セッションCookieまたは認証されたユーザーを含む要求を無視し、application/jsonfrom を含むほとんどのMIMEタイプを無視し/api/article/1843/infoます。使用可能な構成オプションはありますが、通常はきめ細かくなく、むしろ「すべてまたは何も」ではありません。

Varnishは、カスタムの複雑なルール(VCLを参照)を使用して、キャッシュ可能なものとそうでないものを定義できます。これらのルールは、特定のコンテンツをURI、ヘッダー、現在のユーザーセッションCookie、MIMEタイプおよびコンテンツ別にキャッシュできます。これにより、非常に具体的な負荷パターンに対してWebサーバーの処理能力を大幅に節約できます。それは、ワニスが便利で素晴らしいときです。

結論

これらのすべての部品、それらをいつ使用し、どのように組み合わせるかを理解するのに時間がかかりました。これがあなたのお役に立てば幸いです。

それは非常に長いことがわかりました(書くのに6時間。OMG!:O)。たぶん私はそれについてブログか本を始めるべきです。楽しい事実:回答の長さに制限はないようです。


5
回答の長さには制限がありますが、それに到達するにはさらに数冊の本を書く必要があります。
マイケルハンプトン

2
キャッシングに関して言及する価値がある1つのポイント:アプリケーションを制御できない場合にサイトのパフォーマンスを改善する強力な方法。特に、アプリケーションに本当に愚かなキャッシュヘッダーがある場合(エンタープライズアプリはありますか?)。ただし、認証されたリソースについては、より多くの注意を払う必要があります。
キャメロンカー

@ user5994461あなたのブログを読みたいです。すばらしい答えです!
oxalorg

20

3つのツールが共通の機能を共有しているのは事実です。ほとんどのセットアップは、3つのうち2つを組み合わせても問題ありません。それは、その主な目的によって異なります。アプリケーションサーバーが静的(たとえば、nginx)で高速であることがわかっている場合は、キャッシングを犠牲にして受け入れるのが一般的です。数十または数百のサーバーをインストールし、それらを最大限に活用したり、問題のトラブルシューティングをしたりしない場合、いくつかの負荷分散機能を犠牲にするのが一般的です。どこでも多くのコンポーネントを備えた分散アプリケーションを実行しようとする場合、いくつかのWebサーバー機能を犠牲にするのが一般的です。それでも、一部の人々はそれらのすべてで面白い農場を建設します。

3つの堅実な製品について話していることに留意してください。通常、それらの負荷を分散する必要はありません。フロントSSLが必要な場合は、リバースプロキシとして最初にnginxで問題ありません。あなたがそれを必要としないならば、正面のニスは大丈夫です。その後、haproxyを使用してアプリの負荷を分散できます。ファイルの種類やパスに応じて、haproxy自体の異なるサーバーファームに切り替えたい場合もあります。

場合によっては、重いDDoS攻撃から保護する必要があり、前のhaproxyは他のhaproxyよりも適しています。

一般に、選択間でどのような妥協を行うかについて心配する必要はありません。ニーズに合わせて最高の柔軟性を得るために、それらをどのように組み立てるかを選択してください。それらのいくつかを複数回積み重ねたとしても、それは時々あなたのニーズに応じて正しいかもしれません。

これが役立つことを願っています!


1
HAProxyの+1-作成者はサーバー障害に関する質問に答えます。ありがとう。
ジョエルK

Arenstar:これらのツールの1つを作成しましたか?Willy TarreauはHAProxyの主要な開発者です。
ジョエルK

このウィリーをありがとう。上記のArenstarへの私の質問に答えてくれました。
ジョン

2
HAProxyの現在の開発コードにはSSLが含まれていることに注意してください。
ジョエルK

14

他のすべての回答は2010年以前のものであるため、更新された比較が追加されています。

Nginx

  • 完全なWebサーバー、その他の機能も使用できます。例:HTTP圧縮
  • SSLサポート
  • Nginxは最初から軽量になるように設計されていたため、非常に軽量です。
  • ニアワニスキャッシュのパフォーマンス
  • HAProxyロードバランシングパフォーマンスに近い

ワニス

  • 複雑なキャッシングシナリオに最適で、アプリケーションと統合します。
  • 最高の静的ファイルキャッシュ
  • SSLサポートなし
  • メモリとCPUイーター

ハプロキシ

  • ハードウェアロードバランサーに匹敵する、最先端のロードバランシング機能に最適なロードバランサー
  • SSLは1.5.0以降でサポートされています
  • シンプルで、HTTP実装のない単なるTCPプロキシであるため、より高速でバグが発生しにくくなります。

したがって、最善の方法は、それらすべてを適切な順序で実装することです。

ただし、一般的な目的では、キャッシュ、リバースプロキシ、負荷分散など、すべてのリソースで平均以上のパフォーマンスが得られるため、リソース使用率のオーバーヘッドが非常に少ないNginxが最適です。そして、SSLと完全なWebサーバー機能を使用できます。


6

Varnishは負荷分散をサポートしています:http : //www.varnish-cache.org/trac/wiki/LoadBalancing

Nginxは負荷分散をサポートしています:http : //wiki.nginx.org/NginxHttpUpstreamModule

ワニス+トンネルでこれを設定するだけです。他の理由でnginxが必要な場合は、nginx +ニスを使用します。nginxがSSL接続を受け入れてワニスにプロキシし、ワニスがhttp経由でnginxと通信できるようにします。

一部の人々はnginx(またはApache)をミックスに投入するかもしれません。これらはVarnishよりも多少汎用的なツールだからです。たとえば、プロキシレイヤーでコンテンツを変換する場合(XDV、Apacheフィルターなどを使用)、これらのいずれかが必要になります。Varnishはそれ自体ではできないためです。これらのツールの構成に精通している人もいるので、ロードバランサーとして既にApache / nginx / haproxyに精通しているため、単純なキャッシュとしてVarnishを使用し、別のレイヤーで負荷分散を行う方が簡単です。


正しい-「バックエンドプール」とは、これら3つすべてに負荷分散機能があることを示すことを意味していました。最初の調査から、HAProxyには最も調整可能な負荷分散オプションがあるようです。
ジョエルK

負荷分散ツールとして専用に設計されているため、これは理にかなっています。一方、Varnishの負荷分散機能は非常に優れており、このミックスから1つのプロセスを削除することで、レイテンシーの少ないシンプルな構成が得られます。
ラースク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.