NGINXは、非常に高性能なWebサーバーとして高い評価を得ています。NGINXをリバースプロキシとしても使用できることは広く知られていますが、その強力さまでは十分に認識されていないかもしれません。
リバースプロキシとは?
まず一歩戻って、プロキシサーバーとは何かを考えてみましょう。Wikipediaには、分かりやすい定義があります。
「プロキシサーバーとは、他のサーバーにあるリソースを要求するクライアントからのリクエストを仲介するサーバー(コンピューターシステムまたはアプリケーション)です。」
つまり、プロキシサーバーは、クライアントと、クライアントが求めるデータをホストする実際のサーバーとの間に位置します。クライアントから見ると、プロキシサーバーは実際のバックエンドサーバーのように見え、バックエンドサーバーから見ると、プロキシサーバーはクライアントのように見えます。リバースプロキシサーバーの定義について、再び「Wikipedia」を参照します:
「リバースプロキシとは、クライアントに代わって1台以上のサーバーからリソースを取得するプロキシサーバーの一種です。」
違いは、プロキシサーバーがクライアントと単一のバックエンドサーバーの間に配置されるのに対し、リバースプロキシサーバーは1台以上のバックエンドサーバーの前に配置され、リクエストごとに使用するサーバーを決定する点です。
リバースプロキシを使用するメリット
リバースプロキシサーバーを使用する理由は何でしょうか。主なメリットは次のとおりです。
- 同時接続処理 – インターネットアプリケーションでは、多数のクライアントがそれぞれ複数の接続を開くことが多く、その結果、バックエンドサーバーへの接続数が膨大になります。多くのWebサーバーやアプリケーションサーバーは、大量の接続を効率的に処理できません(Webサーバーとして使用する場合のNGINXは例外です)。そのため、複数の接続をより効率的に処理できるリバースプロキシを追加することで、バックエンドサーバーのパフォーマンスを大幅に向上できる可能性があります。
- 耐障害性 – クライアントがバックエンドサーバーに直接接続している場合、そのサーバーに障害が発生すると、現在接続中(または接続を試行中)のすべてのクライアントでリクエストが失敗します。リバースプロキシサーバーはバックエンドサーバーの稼働状態を監視し、障害が発生したサーバーが復旧するまで、そのサーバーへのリクエスト送信を停止できます。リバースプロキシが稼働中のバックエンドサーバーにリクエストを自動転送するため、クライアントにはエラーが表示されません。
- スケーラビリティ – リバースプロキシはバックエンドサーバー群にとって唯一の「公開窓口」となるため、トラフィック負荷の変化に応じてサーバーを追加または削除できます。
- レイヤー7ルーティング – リバースプロキシは、すべてのサーバーに向かうトラフィックを把握し、必要に応じてリクエストとレスポンスを変更しながら、各リクエストの送信先を適切に判断できます。リクエスト内の特定のHTTPヘッダー、URLの一部、クライアントの地理的位置などに基づいて、ルーティングを決定できます。
- キャッシュ – リバースプロキシは、キャッシュを行うのに最適な場所です。すべてのリクエストをバックエンドサーバーに送信し、各バックエンドサーバーで個別にキャッシュを構築するよりも、通常はリバースプロキシでコンテンツをキャッシュする方がはるかに効率的です。
- その他の機能 – リバースプロキシをバックエンドサーバーの前段に配置することで、帯域幅やリクエストレートに基づくトラフィックシェーピング、接続数の制限、各種認可方式との統合、アクティビティの監視など、さまざまな機能も実行できます。
NGINX Plusをリバースプロキシとして使用する
NGINX Plusは、定評あるNGINX Open SourceのWebサーバー機能にさらに多くの機能を追加し、プロプライエタリなハードウェアアプライアンスを置き換えられる、フル機能のアプリケーションデリバリーコントローラー(ADC)を実現します。
以下は、NGINX Plusで利用できる機能の一部です。
ロードバランシング
重み付けあり、重み付けなしの複数の負荷分散アルゴリズムから選択できます。セッション維持もサポートしています。NGINX Plusは、HTTP、HTTPS、WebSocket、FastCGI、memcached、SCGI、SPDY[現在は廃止され、NGINX Plusで負荷分散が可能なHTTP/2に移行]、uwsgiの負荷分散に対応しています。詳細はこちら。
ヘルスチェック
バックエンドサーバーの健全性は、パッシブ監視とアクティブ監視の両方に対応しています。NGINX Plusがノードに接続できない場合、そのノードはダウンとしてマークされます。バックエンドノードに対して定期的にアクティブヘルスチェックを実行するよう設定することもできます。また、スロースタート機能を使用すると、オンラインになったばかりのノードへのトラフィックをNGINX Plusが徐々に増やし、負荷の高いトラフィックが一気に集中するのを防ぐことができます。詳細はこちら。
リクエストルーティング
トラフィックは、クライアントIPアドレス、ホスト名、URI、クエリ文字列、ヘッダーなど、リクエストの任意の部分に基づいてルーティングできます。
リクエストとレスポンスの書き換え
リクエストまたはレスポンスのヘッダー、本文、URIなど、あらゆる部分を変更できます。NGINX Plusでは、ヘッダーの追加や削除も可能です。詳細はこちら。
キャッシュ
レスポンスをキャッシュできます。また、キャッシュするコンテンツの種類と期間を設定できます。キャッシュから項目を削除することもできます。詳細を見る。
圧縮
Gzip圧縮に対応しており、圧縮するコンテンツや圧縮を使用するタイミングをきめ細かく制御できます。詳細を見る。
SSL/TLS処理
SSL/TLSの復号と暗号化に対応しており、ドメイン名ごとに異なる証明書を使用して、多数のドメイン名を復号できます。詳細を見る。
リアルタイムのアクティビティ監視とログ記録
JSON形式でエンコードされたNGINX Plusの統計情報は、簡単なHTTPリクエストで取得できます。統計情報を表示するダッシュボードWebページが用意されているほか、カスタムまたはサードパーティ製の監視ツールに統計情報を送信することもできます。カスタム形式のログは、ローカルでのログ記録とsyslogへのエクスポートの両方に対応するよう設定できます。詳細はこちら。
その他にも多彩な機能
NGINXには、動画ストリーミング、メールプロキシ、GeoIPへの対応、ダウンタイムを伴わないグレースフルリスタートとアップグレード、トラフィックシェーピング、接続数制限など、ほかにも多くの機能があります。詳しくは、nginx.comおよびnginx.orgをご覧ください。
著者について

関連するブログ記事
チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。
AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。
JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。
F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。
NGINX PlusによるAWS Auto Scalingグループの負荷分散
新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります