
私はAmazon Web Servicesのバックエンド設定、特にInstagramのバックエンド設定をいろいろと調べてきました。Instagram エンジニアリング ブログ彼らは、django/Gunicorn を実行するアプリケーション サーバーの前面にある 3 つの NGINX サーバーの前に Elastic Load Balancer を配置していると述べていますが、これはなぜでしょうか (バッファリングのためでしょうか、キャッシュのためでしょうか)。
もしそうなら、それらの NGINX サーバーを django/gunicorn アプリ サーバーに接続するにはどうすればよいでしょうか?
答え1
Instagram の投稿をざっと見たところ、バッファリングやキャッシュに Nginx を使用しているとは思えません (間違っている可能性もありますが)。私は、Nginx の代わりに HAProxy を使用した同様のものを使用しています。
私たちがこのアプローチを採用した理由のいくつかは次のとおりです。
- NginxとHAProxyはレイヤー7で動作しますが、ELBはレイヤー4以降です。レイヤー7のサービスが必要な場合、ELBはそれを提供できません。
- ヘルスチェックが失敗した場合の接続の正常な終了。ELBは、トラフィックがサービス停止中のインスタンスから遮断されている間も、HAProxy/Nginxへのトラフィックの受け渡しを継続できます。https://forums.aws.amazon.com/message.jspa?messageID=231571
- 必要に応じて、負荷分散レイヤーをライブでスケールアウトできます。
- HAProxy/Nginx レイヤーの背後にある各インスタンスのトラフィックとパフォーマンスに関するより優れたメトリクス
- ELBはHAProxyインスタンスが失敗したことを検出し、そのインスタンスへのトラフィックの送信を停止します。
答え2
私が思いつくいくつかのポイント:
- リクエストを分散し、サーバーの健全性を監視するため、nginx サーバーの 1 つがクラッシュしても、サイトは問題なく動作し続けます。
- Amazon は、自社側でサービス拒否攻撃の緩和策をいくつか実施しています。負荷分散を自社で処理する場合、Amazon に届くすべてのトラフィックに対して料金を支払うことになります。Amazon が ELB に対する攻撃の一部をブロックした場合、その部分に対して料金はかかりません。
- nginx サーバーのセキュリティ グループを ELB のみにロックできるため、パブリック インターネットに公開するよりもセキュリティが強化されます。