Apache と nginx

管理者は、nginx をインストールすることによって、顧客のウェブサイトをホストするウェブサーバの能力を向上できます。nginx とは、高パフォーマンスな補助的ウェブサーバであり、通常はリバースプロキシサーバとして使用します。このウェブサーバは、大量の静的コンテンツ(画像、動画、CSS、XML など)の配信専用に設計されています。Apache と比べ、nginx は大量の同時接続が発生する状況で非常に効率的です。このほかに、nginx が Apache より優れている点としては、クライアント接続ごとのメモリ消費量が大幅に少なくなります。

nginx の利点をフルに活用するために、Plesk では nginx がインターネットと Apache の間のリバースプロキシサーバとして構成されます。つまり、nginx は、サイト訪問者からのすべての要求を処理するフロントエンドのウェブサーバとなります。要求は Apache に送信され、Apache が静的コンテンツと動的コンテンツを識別します。要求が静的ファイル(jpg、css、html など)であれば、Apache は登録されたすべてのハンドラに要求を渡し(.htaccess ディレクトリレベルの構成の適用、URL 変更など)、要求されたファイルに関するファイルシステム上の場所のみを含む応答を nginx に返します。続いて nginx がファイルを探し、クライアントに送信します。要求が動的ファイル(PHP スクリプトなど)であれば、Apache はファイルを実行し、応答を nginx に返します。nginx がこれをクライアントに提供します。

このような nginx と Apache の連携には、次のようなメリットがあります。

  • ウェブサイトへの同時接続の最大数を増やすことができる。
  • サーバ CPU およびメモリリソースの消費量を抑えることができる。
    最大の効果が発揮されるのは、大量の静的コンテンツが含まれるウェブサイト(フォトギャラリー、ビデオストリーミングサイトなど)です。
  • 低速接続環境(GPRS、EDGE、3G など)からの訪問者に、効率的にサービスを提供することができる。
    例えば、接続速度が 10 KB/s のクライアントから、100 KB の応答を生成する PHP スクリプトが要求されたとします。サーバに nginx がインストールされていない場合、Apache が応答を返します。応答を返すために必要な 10 秒間、Apache と PHP はこのオープン接続のためにシステムリソースをフルに消費し続けます。nginx をインストールしている場合、Apache は応答を nginx に転送し(nginx と Apache は同じサーバ上にあるため、接続は非常に高速です)、システムリソースを解放します。nginx のメモリ消費量は少ないため、システム全体の負荷が軽減されます。このような低速接続が大量に発生する場合は、nginx を使用することによってウェブサイトのパフォーマンスを飛躍的に向上することができます。

Plesk での nginx による HTTP 要求の処理方法に関する技術的な詳細は、このセクションで後ほど説明します。Plesk で nginx のサポートを有効にする方法については、「nginx をインストールする」セクションを参照してください。nginx を使用しない場合は、「nginx を無効にする」セクションの説明に従って、Apache をフロントエンドのウェブサーバにしてください。

Plesk での nginx による HTTP 要求の処理方法

nginx と Apache をシームレスに統合するために、Plesk では、さらに次の 2 つの Apache モジュールが使用されています。

  • mod_aclr2
    このモジュールは、他のすべての Apache モジュールのハンドラ(mod_rewrite、.htaccess 関連モジュール、mod_php など)の後で実行されるハンドラをセットアップします。したがって、要求先が動的コンテンツであれば、要求は特定の Apache モジュール(mod_php、mod_perl、mod_cgi など)の上位ハンドラによって対応されるため、mod_aclr2 にはこの要求は渡されません。唯一の例外は SSI 要求です。これらの要求が mod_aclr2 に渡されると、mod_aclr2 は適切なハンドラに要求をリダイレクトします。要求先が静的ファイルであれば、mod_aclr2 はファイルシステム上のファイルロケーションを確認し、ロケーションを nginx に送信します。
  • mod_rpaf
    Apache の観点から見ると、すべてのクライアントは同じ IP アドレス(つまり nginx サーバのアドレス)となります(上の図を参照)。このため、認証や統計などの目的でクライアントの IP アドレスを使用するウェブサイトやウェブアプリケーションに問題が発生します。mod_rpaf では、この問題を解決するために、すべての要求内で nginx サーバの IP アドレスがクライアントの IP アドレスに置き換えられます。より詳細に説明すると、このモジュールは特別な X-Forwarded-For ヘッダを使用し、ここに nginx がクライアントの IP アドレスを追加します。

ここでは、Plesk でこれらのモジュールによって静的コンテンツと動的コンテンツに対する要求を処理する方法について詳しく説明します。

静的ファイルに対する HTTP 要求の処理シーケンスは次のようになります(図を参照)。

  1. クライアントがウェブサーバに要求を送信します。
  2. nginx では X-Accel-Internal ヘッダ(mod_aclr2 が使用する)および X-Forwarded-For ヘッダ(クライアントの IP アドレスが含まれる)が要求に追加され、その要求が Apache に送信されます。
  3. Apache が要求を受け取り、登録されたハンドラによる処理を開始します(.htaccess 構成の適用、URL の変更など)。このステップでは、mod_rpaf によって Apache 変数 REMOTE_ADDR にある nginx サーバの IP アドレスが X-Forwarded-For ヘッダにあるクライアントのアドレスに書き換えられます。
  4. 登録されたすべてのハンドラによって要求が処理された後で、mod_aclr2 に要求が渡されます。このハンドラは X-Accel-Internal ヘッダが存在することを確認します。このヘッダが存在する場合、このモジュールは nginx に、コンテンツの長さがゼロで X-Accel-Redirect ヘッダが付いた応答を送信します。このヘッダには、mod_aclr2 によって確認された、正確なファイルの場所が含まれています。
  5. nginx が応答を受け取ると、nginx はファイルを探し、クライアントに配信します。

次の図は、Plesk で 2 KB の GIF ファイルに対する要求を処理する流れを図示しています。

static_seq

動的コンテンツに対する要求の処理の場合も、ステップ 1〜3 は同じです。続いて、対応する Apache モジュールのハンドラ(mod_phpmod_perlmod_cgi など)に要求が渡されます。この要求は mod_aclr2 には渡されません(SSI 要求を除く)。ハンドラが応答を生成して nginx に送信し、nginx が応答をクライアントに配信します。次の図は、Plesk で PHP ファイルに対する要求を処理する流れを図示しています。


このセクションの内容:

nginx をインストールする

nginx を無効にする

 

nginx をインストールする

Plesk をクリーンインストールすると、nginx がデフォルトで有効になります。旧バージョンからアップグレードした場合は、[ツールと設定]>[アップデートおよびアップグレード]>[コンポーネントを追加]で、アップグレード後いつでも nginx コンポーネントを追加することができます。コンポーネントの追加後に、[ツールと設定]>[サービス管理]リバースプロキシサーバ(nginx)サービスを実行する必要があります。

インストールされている nginx サーバのバージョンを確認するには、[ツールと設定]>[サーバコンポーネント]の順に選択します。

 

nginx を無効にする

Apache ウェブサーバ単独の構成に戻すには、[ツールと設定]>[サービス管理]の順に選択して、リバースプロキシサーバ(nginx)サービスを停止します。

nginx_stop

nginx をもう一度フロントエンドのウェブサーバにするには、リバースプロキシサーバ(nginx)サービスを起動します。

注:リバースプロキシサーバ(nginx)」サービスの処理を開始/停止すると、nginx が起動/停止するだけでなく、ウェブサーバの構成(nginx と Apache の組み合わせまたは Apache のみをフロントエンドウェブサーバに使用)が切り替わります。再起動処理は、他のすべてのサービスと同様に動作し、nginx サービスが再起動します。