Apache と nginx
管理者は、nginx を使用することによって、顧客のウェブサイトをホストするウェブサーバ(Apache)の能力を向上できます。nginx は高性能な補助的ウェブサーバであり、通常はリバースプロキシサーバとして使用します。このウェブサーバは、大量の静的コンテンツ(画像、動画、CSS、XML など)の配信専用に設計されています。Apache と比べ、nginx は大量の同時接続が発生する状況で非常に効率的です。その他に nginx が Apache より優れている点として、クライアント接続あたりのメモリ消費量が大幅に低下します。
nginx の利点をフルに活用するために、Plesk はインターネットと Apache の間のリバースプロキシサーバとして nginx を構成します。つまり、nginx がフロントエンドのウェブサーバとなり、サイト訪問者からのすべての要求を処理します。これらの要求は Apache に送信され、Apache が静的コンテンツと動的コンテンツを識別します。要求が静的ファイル(jpg、css、html など)であれば、Apache は登録されたすべてのハンドラに要求を渡し(.htaccess
ディレクトリレベルの構成の適用や、URL 変更など)、応答を nginx に返します。この応答には、要求されたファイルのファイルシステム上での場所のみが含まれています。続いて nginx がファイルを探し、クライアントに送信します。動的ファイル(PHP スクリプトなど)に対する要求であれば、Apache がこのファイルを実行して応答を nginx に返し、nginx がこれをクライアントに提供します。
このような nginx と Apache の連携には、次のようなメリットがあります。
- ウェブサイトへの同時接続の最大数を増やすことができる。
- サーバの CPU およびメモリのリソース使用量を低減できる。 最大の効果が発揮されるのは、大量の静的コンテンツが含まれるウェブサイト(フォトギャラリー、ビデオストリーミングサイトなど)です。
- 低速接続環境(GPRS、EDGE、3G など)を利用する訪問者に、効率的にサービスを提供することができる。 たとえば、接続速度が 10 KB/s のクライアントが PHP スクリプトを要求し、100 KB の応答が生成されるとします。サーバに nginx がインストールされていない場合、Apache が応答を返します。応答を返すために必要な 10 秒間、Apache と PHP はこのオープン接続のためにシステムリソースをフルに消費し続けます。一方、nginx がインストールされている場合、Apache は応答を nginx に転送し(nginx と Apache は同じサーバ上にあるため、接続は非常に高速です)、システムリソースを解放します。nginx はメモリ消費量が少ないため、システム全体の負荷が軽減されます。このような低速接続が大量に発生する場合は、nginx を使用することによってウェブサイトのパフォーマンスを飛躍的に向上することができます。
Plesk で nginx が HTTP 要求をどのように処理するのかについては、このセクションで後ほど技術的に説明します。Plesk で nginx のサポートを有効にする方法については、「nginx をインストールする」セクションを参照してください。nginx を使用しない場合は、「nginx を無効にする」セクションの説明に従って、Apache をフロントエンドのウェブサーバにしてください。ウェブコンテンツに対するすべての HTTP 要求を 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 要求です。SSI 要求が mod_aclr2 に達すると、mod_aclr2 は適切なハンドラに要求をリダイレクトします。静的ファイルに対する要求の場合、mod_aclr2 はファイルシステム上のファイルロケーションを確認し、ロケーションを nginx に送信します。 - mod_rpaf または mod_remoteip:Apache の観点から言うと、すべてのクライアントは同じ IP アドレス(つまり nginx サーバのアドレス)となります(上の図を参照)。このため、認証や統計などにクライアントの IP アドレスを使用するウェブサイトやウェブアプリケーションでは問題が生じます。mod_rpaf(Apache 2.2 の場合)または mod_remoteip(Apache 2.4 の場合)は、この問題を解決するために、すべての要求内で nginx サーバの IP アドレスがクライアントの IP アドレスに置き換えます。より詳しく説明すると、このモジュールは特別な X-Forwarded-For ヘッダを使用して、ここに nginx がクライアントの IP アドレスを追加します。
では、Plesk がこれらのモジュールによって静的コンテンツおよび動的コンテンツに対する要求をどのように処理するのか見てみましょう。
静的ファイルに対する HTTP 要求の処理シーケンスは、以下の通りです(図を参照)。
- クライアントがウェブサーバに要求を送信します。
- nginx が、要求に X-Accel-Internal ヘッダ(mod_aclr2 が使用)および X-Forwarded-For ヘッダ(クライアントの IP アドレスを含む)を追加し、それを Apache に送信します。
- Apache が要求を受け取り、登録されたハンドラによる処理を開始します(
.htaccess
構成の適用、URL の変更など)。このステップで、mod_rpaf によって Apache 変数 REMOTE_ADDR にある nginx サーバの IP アドレスが X-Forwarded-For ヘッダにあるクライアントのアドレスに書き換えられます。 - 登録されたすべてのハンドラによって要求が処理された後で、mod_aclr2 に要求が渡されます。このハンドラは X-Accel-Internal ヘッダが存在することを確認します。このヘッダが存在する場合、このモジュールは nginx に、コンテンツの長さがゼロで X-Accel-Redirect ヘッダが付いた応答を送信します。このヘッダには、mod_aclr2 によって確認された正確なファイルロケーションが含まれています。
- nginx が応答を受け取ると、nginx はファイルを探し、クライアントに配信します。
以下の図は、Plesk が 2 KB の GIF ファイルに対する要求を処理する流れを示しています。
動的コンテンツに対する要求の処理の場合も、ステップ 1~3 は同じです。続いて、対応する Apache モジュールのハンドラ(mod_php、mod_perl、mod_cgi など)に要求が渡されます。この要求は mod_aclr2 には渡されません(SSI 要求を除く)。ハンドラが応答を生成して nginx に送信し、nginx が応答をクライアントに配信します。以下の図は、Plesk が PHP ファイルに対する要求を処理する流れを示しています。
nginx をインストールする
Plesk のクリーンインストールを実行すると、nginx がデフォルトで有効になります。旧バージョンからアップグレードした場合は、アップグレード後にいつでも [ツールと設定] > [アップデート] ([Plesk] の下) > [コンポーネントを追加/削除] で「Nginx web server」コンポーネントを追加できます。コンポーネントを追加した後で、 [ツールと設定] > [サービス管理] ([サーバ管理] の下) で リバースプロキシサーバ (nginx) サービスを起動します。
インストールされている nginx サーバのバージョンは、 [ツールと設定] > [サーバコンポーネント] ([サーバ管理] の下) で確認できます。
nginx を無効にする
単一の Apache ウェブサーバのみの構成に戻すには、 [ツールと設定] > [サービス管理] ([サーバ管理] の下) で リバースプロキシサーバ (nginx) サービスを停止します。
nginx を再びフロントエンドのウェブサーバにするには、リバースプロキシサーバ(nginx)サービスを起動します。
注釈: 「リバースプロキシサーバ(nginx)」サービスの処理を開始/停止すると、nginx が起動/停止するだけでなく、ウェブサーバの構成(nginx と Apache の組み合わせまたは Apache のみをフロントエンドウェブサーバに使用)が切り替わります。一方、再起動の場合は、他のすべてのサービスと同じく、nginx サービスが再起動します。