CDN, ロードバランサーがあるwebアプリの前段にNginxはいるのか?

2023/04/04に公開

概要

「負荷のためにRailsやDjangoの手前にNginxをいれよう!」という記事が多く存在します。

ただ、僕は以下の疑問を覚えました。

  • 「モダンな構成でnginx本当に必要なのか?]
  • 「あんまわかってないnginx入れてリソース増やして管理コストあげてまで、本当に負荷が下がってくれるのか?」

本記事は、その調査についてのメモとなります。

結論

要件次第だが、CDNやLoadBalancerが入っていれば大概Nginxはなくていい。

昔はNginxが必要だった

「負荷分散」「キャッシュ」「セキュリティ」「SSL/TLSの接続」という観点からNginxが役割を果たしていました。
それぞれの項目における 「問題点」 および 「nginx(リバースプロキシの仕組み)によって解決すること」 を整理しました。

項目 問題点 解決の方法
負荷分散 単一のアプリケーションサーバーだと負荷が集中する 複数のアプリケーションサーバーを用意し、リバースプロキシやロードバランサーでトラフィックを適切に分散する
キャッシュ アプリケーションサーバーへのリクエストが多いとパフォーマンスが低下する 静的アセットや一部の動的コンテンツをキャッシュし、アプリケーションサーバーへのリクエストを減らす
セキュリティ クライアントから直接アプリケーションサーバーにアクセスされるリスクがある リバースプロキシを使用してアプリケーションサーバーを隠蔽し、IP制限やリクエストのフィルタリングなどのセキュリティ対策を追加する。
SSL/TLSの接続 アプリケーションサーバーでSSL/TLSを処理すると負荷がかかる リバースプロキシでSSL/TLSの接続を行い、アプリケーションサーバーへの接続を暗号化し、負荷を軽減する

CDN, LoadBalancerが当たり前の現代において

上記の役割のほぼ全てにおいて、代替手段が存在 します。

項目 対応リソース 解決の方法
負荷分散 LoadBalancerが対応 複数のアプリケーションサーバーへのトラフィックを適切に分散する
キャッシュ CDNが対応 CDNが静的アセットや一部の動的コンテンツをキャッシュし、アプリケーションサーバーへのリクエストを減らす
セキュリティ LoadBalancerやセキュリティグループが対応 IP制限やリクエストのフィルタリングなどのセキュリティ対策が簡単に設定可能。
SSL/TLSの接続 LoadBalancerが対応 LoadBalancerでSSL/TLSの接続を行い、アプリケーションサーバーへの接続を暗号化できる

なので、あるあるなクラウドの構成を用いるサービスであれば、nginxを前段に入れる必要はありません。
もちろん、Nginx はその他にもカスタム設定やアプリケーション特有の要件を満たすために役立つことがあります。例えば、特定のルートに対してカスタムヘッダーやリダイレクトルールを適用したり、リクエストの処理方法を微調整する場合などです。このような特殊な要件がある場合は、Nginx の導入を検討することが適切です。
しかし、ほとんどの一般的な用途では、上記の設計だけで十分な機能が提供されるため、Nginx を追加する必要はありません。

CloudRunでRailsだけdeployするのもありありということですね。

結論(再掲)

モダンなクラウド環境であれば、基本的にNginxを無理していれる必要はない。CDNはLoadBalancerを活用しよう。

参考

Discussion