Nginx による負荷分散を 5 歳児に説明する

Nginx による負荷分散を 5 歳児に説明する

アップストリーム サーバーを使用して Nginx をロード バランサーとして構成する方法に関する DIY の投稿やチュートリアルをたくさん見つけました。

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;
  }
}

しかし、このアーキテクチャを構成する上で私が見つけられるのはここまでです。現在、3 つのバックエンド VPS サーバーに Rails アプリケーションをデプロイしており、HTTP サーバーには Unicorn を使用しています。負荷分散サーバーにも Rails アプリケーションと Unicorn とともに Ruby をインストールする必要がありますか? 各上流サーバーに Nginx をインストールする必要がありますか? そうであれば、どのように構成すればよいですか? Varnish のようなものをアーキテクチャに導入する場合、それはどこに配置すればよいですか? 負荷分散サーバーの前ですか、それとも各バックエンドですか?

すべてをどのように整理しているかを図で示します。

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

答え1

短い答え:

Nginx実際には、ジョブは 1 つだけであり、そのジョブは、着信要求を受け入れて、それをバックエンド サーバーに渡すことです。

そう考えると、フロントエンド サーバーは のみを実行する必要がありnginx、バックエンド サーバーは のみを実行する必要がありますrails。わかりますか?

さて、バックエンドとフロントエンドの両方が同じサーバー上で実行されている場合、もちろん、そこにもインストールする必要がありますが、図から判断すると、そうではないと思います。

などの HTTP キャッシュ ソフトウェアを導入すると、それはとVarnishの間を通過し、バックエンド サーバーでも実行される可能性が高くなります。そのため、リクエストは次のパスに従います。NginxRails

Nqinx -> Varnish -> Rails

答え2

Rails を使用する場合、nginxHTTP ロード バランサーやアプリケーション サーバーのフロントエンドとして、いくつかの役割を果たすために使用できます。セットアップは一般的なものであり、問​​題なく機能しますが、トラフィック レベルが増加するとスケーリングの課題が発生する可能性があります。

あなたが説明したように、少数の VPS サーバーで作業している場合、1 つの nginx インスタンスは、着信トラフィックに対するプライマリ HTTP ロード バランサーとして、および Rails アプリケーション サーバーから低レベルの責任 (静的ファイルの提供、URL の書き換え/リダイレクトなど) を軽減するフロントエンドとして、両方の役割を果たします。

nginx は多くのリソースを使わずに数千の同時接続を処理できますが、Unicorn Rails アプリケーション サーバーは通常、少数の同時接続しか処理できません。規模が大きくなると、より多くのロード バランサー/フロントエンド nginx インスタンス (およびそれらの間の負荷分散方法、DNS ラウンドロビンやその他のメカニズムなど) が必要になります。

Amazon AWS やその他のより成熟したホスティング プラットフォームを使用する場合、Elastic Load Balancing (ELB) などのサービスを主要な Web ロード バランサーとして使用することがよくあります。各アプリケーション サーバーは nginx/Unicorn を実行し、nginx をフロントエンドとして使用して各 Unicorn から処理をオフロードします。各サーバーの前に大容量の ELB があるため、スケーリングがはるかに簡単になります。

関連情報