Apache でキャッシュを有効にして Web サイトのパフォーマンスを向上させる

Overview

ほとんどの Web サイトには、公開後に変更されない、またはほとんど変更されないコンテンツが大量に存在します。 そして、Web サーバーから要求されるたびに、変更されたかどうかにかかわらず、再処理されてクライアントに送信され、貴重なシステム リソースとネットワーク帯域幅が不必要に消費されます。

これはリソースの効率的な使用ではなく、負荷に対応するためにさらにハードウェアをインストールすることになり、最終的に多くのコストがかかることになります。 そこで、キャッシュの出番となるわけです。 一定時間内に変更される可能性のない、以前にアクセスしたコンテンツを処理するためにCPUサイクルやRAMを浪費するのはやめましょう。 その代わりに、サーバーやウェブブラウザーのキャッシュに一時的に保存された、事前処理済みのコンテンツを提供することにしましょう。

Configure Caching in Apache

Apache にはコンテンツをキャッシュするための 3 つのモジュールがあり、1 つはそれを有効にし、残りの 2 つはキャッシュ ストアがディスクまたはメモリ上に存在する場所を決定します。 キャッシュ ストアに使用するモジュールを決定することは、利用可能なハードウェア リソースとパフォーマンス要件に依存します。 メモリからの提供は高速ですが、コストとリソース消費の両方で高価です。

  1. 以下の行が Apache のサーバー構成ファイルに存在することを確認することにより、cache_module が Apache によってロードされていることを確認し、コメントアウトしないようにします。
    LoadModule disk_cache_module modules/mod_disk_cache.so
  2. 以下の行を Apache サーバー設定ファイル (グローバル) または VirtualHost ディレクティブ (アプリケーションのローカライズ) の内部に追加してください。 Cacheroot

    すべてのキャッシュコンテンツが保存されるキャッシュストアディレクトリを設定します。

    CacheDefaultExpire

    元の要求日を基準に、デフォルト有効期間を秒で設定します。

    CacheDisable

    オプションに従って相対パスに対してキャッシュを無効化します。 機密性の高い領域やキャッシュすべきでない領域は、ここに追加してください。

Setting Content Expiration

キャッシュが機能するには、有効期限が必要です。

Use Apache’s Mod_Expires

このモジュールにより、コンテンツの有効期限を、全体として、またはタイプや一致する文字列に基づいて個別に定義することができます。 サーバー設定ファイル(CentOSではhttpd.conf)を開き、この行を探します。 コメントアウトされている場合は、アンコメントします。

LoadModule expires_module modules/mod_expires.so
  • 以下の行を、Apache サーバー設定、バーチャルホスト設定、ディレクトリディレクティブ、または .NET Framework のいずれかに追加します。
    <IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day"</IfModule></pre>

    ExpiresActive On

    Turn on mod expires.

    ExpiresDefault

    Set the default expiration date for all content.これは、すべてのコンテンツのデフォルトの有効期限を設定します。 Access plus 1 day は、有効期限をコンテンツのアクセス時間 + 1 日に設定し、24 時間キャッシュされることを意味します。

  • 特定のコンテンツ タイプに異なる有効期限値を割り当てたい場合は、ExpiresDefault オプションに加えて、またはオプションなしで ExpiresByType オプションを使用することができます。 以下はその例です:
    <IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day" ExpiresByType image/jpg "access plus 5 days" ExpiresByType image/jpeg "access plus 5 days" ExpiresByType image/gif "access plus 5 days" ExpiresByType image/png "access plus 5 days" ExpiresByType text/css "access plus 1 month" ExpiresByType application/pdf "access plus 1 month" ExpiresByType text/x-javascript "access plus 1 month" ExpiresByType application/x-shockwave-flash "access plus 1 month" ExpiresByType image/x-icon "access plus 1 year"</IfModule>
  • Use HTTP Headers in the Web Application

    Expiration and last modification dates can be defined by the Web application using HTTP Header parameters.Web アプリケーションで、有効期限と最終更新日を定義できます。 これにより、開発者またはアプリケーションにコンテンツの新鮮さを制御させることができます。

    • HTML
      Meta タグを使用し、コンテンツの年齢を定義します。 以下の例では、キャッシュをプライベート (要求しているクライアントのみ) に設定し、最大年齢を 1 時間 (3600 秒) に設定します。
      <meta http-equiv="Cache-control" content="private,max-age:3600">
    • PHP
      Header() 関数を使用して、ドキュメント ヘッダーのコンテンツ年齢を設定します。
      header("Cache-Control: private, max-age=3600");

    Cache Non-Expiring Content

    時には有効期限のないコンテンツをキャッシュする必要がある場合があります。 先に述べたように、有効期限はキャッシュ機構が動作するための要件で、デフォルトで設定されています。 しかし、有効期限が定義されていないコンテンツにデフォルトの有効期限を付加し、キャッシュするように Apache に指示することができます。 CacheIgnoreNoLastMod はこれを可能にします。

    1. キャッシュを有効にした場所 (Apache のサーバー設定ファイルまたはバーチャルホスト設定ファイル) に On の値で CacheIgnoreNoLastMod オプションを追加してください。
      CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod On

    Prevent Browsers from Caching Content

    上記のキャッシュ構成の問題は、アプリケーションのコンテンツがクライアントとサーバーの 2 か所にキャッシュされることです。 コンテンツを更新してユーザーにすぐに見てもらいたい場合、ローカルにキャッシュされたバージョンが有効期限切れになっていないと、見ることができないかもしれません。 有効期限を短くすることはできますが、それではキャッシュの目的を完全に失うことになります。

    代わりに、サーバー上でのみ有効にして、キャッシュを完全に制御します。 Web ブラウザはリクエストごとにサーバーからコンテンツを取得しますが、コンテンツが変更されていない限り、たとえば、前処理された Java または PHP コンテンツを提供するように強制します。

    1. CacheIgnoreCacheControl オプションを、キャッシュが有効になっている場所 (Apache のサーバー設定ファイルまたはバーチャルホストの設定) に On の値で追加してください。 これにより、Apache はブラウザのコンテンツリフレッシュ要求を無視するようになります。
      CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod OnCacheIgnoreCacheControl On
    2. 変更を保存する。
    3. 変更を適用するために Apache を再起動する。

    WordPress と他のアプリケーションフレームワーク

    WordPress や CodeIgniter のようなフレームワークは、すべてのコンテンツが Index.php を通してルーティングされます。 mod_rewrite ルールをどのように書いたかによって、キャッシュされたコンテンツが正しく表示されないことがあります。

    これに対処するために、コンテンツがキャッシュされ引き出されるとき、Apache のキャッシュが index.php の末尾に追加されたパラメータを考慮するようにする必要があります。 以下の例に見られるように、index.phpのRewriteルールを変更します。

    コメントする