アップストリーム サーバーを使用して 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
の間を通過し、バックエンド サーバーでも実行される可能性が高くなります。そのため、リクエストは次のパスに従います。Nginx
Rails
Nqinx -> Varnish -> Rails
答え2
Rails を使用する場合、nginx
HTTP ロード バランサーやアプリケーション サーバーのフロントエンドとして、いくつかの役割を果たすために使用できます。セットアップは一般的なものであり、問題なく機能しますが、トラフィック レベルが増加するとスケーリングの課題が発生する可能性があります。
あなたが説明したように、少数の VPS サーバーで作業している場合、1 つの nginx インスタンスは、着信トラフィックに対するプライマリ HTTP ロード バランサーとして、および Rails アプリケーション サーバーから低レベルの責任 (静的ファイルの提供、URL の書き換え/リダイレクトなど) を軽減するフロントエンドとして、両方の役割を果たします。
nginx は多くのリソースを使わずに数千の同時接続を処理できますが、Unicorn Rails アプリケーション サーバーは通常、少数の同時接続しか処理できません。規模が大きくなると、より多くのロード バランサー/フロントエンド nginx インスタンス (およびそれらの間の負荷分散方法、DNS ラウンドロビンやその他のメカニズムなど) が必要になります。
Amazon AWS やその他のより成熟したホスティング プラットフォームを使用する場合、Elastic Load Balancing (ELB) などのサービスを主要な Web ロード バランサーとして使用することがよくあります。各アプリケーション サーバーは nginx/Unicorn を実行し、nginx をフロントエンドとして使用して各 Unicorn から処理をオフロードします。各サーバーの前に大容量の ELB があるため、スケーリングがはるかに簡単になります。