すべてのプロダクト
Search
ドキュメントセンター

:Apache キャッシュポリシーの設定

最終更新日:Oct 14, 2025

Apache で Web キャッシュポリシーを設定すると、ブラウザや CDN (コンテンツ配信ネットワーク) などの仲介プロキシがダウンロード済みのリソースを再利用できるため、不要なネットワークリクエストが減少します。結果として、ページの読み込み速度の向上、サーバー負荷および帯域幅消費の削減につながります。

説明

免責事項: このトピックには、サードパーティ製品に関する情報が含まれている場合があります。Alibaba Cloud は、サードパーティ製品のパフォーマンスや信頼性について、いかなる表明も保証も行いません。これらの製品の使用から生じる潜在的な影響については、お客様が責任を負うものとします。

Apache モジュールの選択

Apache モジュール

メリット

デメリット

適用シナリオ

mod_expires

シンプルな構文で、様々なファイルタイプに対して有効期限を迅速に設定可能です。

機能が限定されているため、no-storeimmutableなどのCache-Control ディレクティブは設定できません。

ブラウザや CDN にファイルのキャッシュ期間 (max-age) を通知するなど、基本的なキャッシュポリシーの設定。

mod_headers

HTTP ヘッダーを完全に制御可能で、immutable など、すべての Cache-Control ディレクティブ をサポートします。

mod_expires よりも構文が複雑です。

きめ細かく包括的なキャッシュ戦略が求められる本番環境。

操作手順

モジュールの有効化

キャッシュポリシーを設定する前に、Apache で headers および expires モジュールが有効になっていることを確認してください。

  • モジュールがロードされているか確認するには、apachectl -M または httpd -M コマンドを実行します。出力リストに headers_moduleexpires_module が含まれていることを確認してください。

  • モジュールを有効化します。

    • Debian/Ubuntu の場合:

      sudo a2enmod headers expires
      sudo systemctl restart apache2
    • CentOS/RHEL/Alibaba Cloud Linux の場合: これらのモジュールは通常、デフォルトでコンパイルまたはロードされます。見つからない場合は、/etc/httpd/conf.modules.d/ ディレクトリ内の設定ファイルを確認し、LoadModule の行がコメントアウトされていないことを確認してください。

設定ファイルの場所の選択

キャッシュ設定は、専用のファイルにまとめるか、サイトの VirtualHost ブロックに保存できます。

  • 推奨: CentOS/RHEL の場合は /etc/httpd/conf.d/ ディレクトリに、Debian/Ubuntu の場合は /etc/apache2/conf-available/ ディレクトリに cache.conf などの新しいファイルを作成します。

  • 非推奨: .htaccess ファイルでの設定は避けてください。Apache はリクエストごとに .htaccess を読み込んで解析する必要があるため、不要なパフォーマンスオーバーヘッドが発生します。

設定例

グローバルデフォルトキャッシュ有効期限の設定

mod_expires

<IfModule mod_expires.c>
    # mod_expires 機能を有効にする
    ExpiresActive On
    # すべてのリソースのデフォルトキャッシュ時間を 1 日に設定する
    ExpiresDefault "access plus 1 day"
</IfModule>

mod_headers

<IfModule mod_headers.c>
    # Cache-Control ヘッダーを設定する。キャッシュ時間は 1 日
    Header set Cache-Control "max-age=86400, public"
</IfModule>

ファイルタイプ別のキャッシュポリシー設定

mod_expires

<IfModule mod_expires.c>
    # mod_expires 機能を有効にする
    ExpiresActive On

    # デフォルトのキャッシュ時間を 1 日に設定する
    ExpiresDefault "access plus 1 day"

    # 画像リソースを 1 か月間キャッシュする
    ExpiresByType image/jpeg "access plus 1 month"
    ExpiresByType image/png "access plus 1 month"
    ExpiresByType image/gif "access plus 1 month"
    ExpiresByType image/svg+xml "access plus 1 month"

    # CSS および JS ファイルを 1 週間キャッシュする
    ExpiresByType text/css "access plus 1 week"
    ExpiresByType application/javascript "access plus 1 week"

    
</IfModule>

mod_headers

<IfModule mod_headers.c>
    # 画像リソースを 1 か月間キャッシュする
    <FilesMatch "\.(jpg|jpeg|png|gif|svg)$">
        Header set Cache-Control "max-age=2592000, public"
    </FilesMatch>

    # CSS および JS ファイルを 1 週間キャッシュする
    <FilesMatch "\.(css|js)$">
        Header set Cache-Control "max-age=604800, public"
    </FilesMatch>
</IfModule>

特定のリソースタイプのキャッシュ無効化

mod_expires

<IfModule mod_expires.c>
    # mod_expires 機能を有効にする
    ExpiresActive On
    # HTML ファイルをキャッシュしない
    ExpiresByType text/html "access plus 0 seconds"
</IfModule>

mod_headers

<IfModule mod_headers.c>
    #  HTML ファイルのキャッシュを無効にする
    <FilesMatch "\.html$">
        Header set Cache-Control "no-store, no-cache, must-revalidate"
        Header set Pragma "no-cache"
        Header set Expires "0"
    </FilesMatch>
</IfModule>

カスタムキャッシュポリシーの設定

以下の mod_expiresmod_headers の構文ルールを使用してポリシーをカスタマイズできます。

mod_expires

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "base_time plus time_unit"
    ExpiresByType mime_type "base_time plus time_unit"
</IfModule>
  • ExpiresActive On: mod_expires モジュールを有効にします。

  • ExpiresDefault: タイプが定義されていないすべてのリソースのデフォルトキャッシュ時間を設定します。

  • ExpiresByType: 特定の Multipurpose Internet Mail Extensions (MIME) タイプのキャッシュ時間を設定します。

  • mime_type: ファイル形式を定義する MIME タイプ (例:image/jpegimage/giftext/csstext/html) 。メインタイプとサブタイプをスラッシュで区切って指定します。

  • base_time: キャッシュの基準時間。通常は access (ユーザーがファイルにアクセスしたとき) または modification (ファイルが最終変更されたとき) です。

  • time_unit: 時間単位。例:

    • seconds

    • minutes

    • hours

    • days

    • weeks

    • months

    • years

mod_headers

<IfModule mod_headers.c>
    Header set|append|unset header_name "value"
</IfModule>
  • Header set: 指定された HTTP ヘッダーフィールドの値を設定します。

  • Header append: 既存の値にコンテンツを追加します。

  • Header unset: 指定された HTTP ヘッダーフィールドを削除します。

  • header_name: Cache-ControlExpires など、操作対象の HTTP ヘッダーフィールド名。

  • value: 設定する値。

<FilesMatch> の概要

<FilesMatch> ディレクティブは、正規表現を使用してファイル名やパスを照合します。これにより、一致するファイルに特定の構成ルールを適用できます。例:

  • .jpg.png などの画像ファイルに長いキャッシュ時間を設定する。

  • .htaccess.log などの機密ファイルへのアクセスを禁止する。

  • CSS や JS ファイルなどの静的リソースに特定の HTTP ヘッダーを追加する。

<FilesMatch> の基本構文:

<FilesMatch "regular_expression"> </FilesMatch>
  • regular_expression: ファイル名またはパスを照合するために使用されます。一般的な照合パターン:

    • \.(extension)$: 特定の拡張子を持つファイルに一致します。たとえば、\.(jpg|jpeg|png)$ はすべての .jpg.jpeg.png ファイルに一致します。

    • ^/path/: 特定のパス内のファイルに一致します。

    • .*: 任意のファイル名に一致します。

設定の検証と適用

設定変更後は、サービスの中断を防止するため、構文をチェックしてから、サービスを再読み込みしてください。

  • 設定構文のチェック:変更を適用する前に、構文チェックコマンドを実行してエラーがないことを確認します。

    • CentOS/RHEL/Alibaba Cloud Linux: sudo httpd -t

    • Debian/Ubuntu: sudo apache2ctl -t

    出力が Syntax OK であれば、次に進めます。

  • 設定の適用 (グレースフルリロードを推奨):

    reload コマンドを使用すると、既存の接続を切断せずに新しい設定を適用できます。

    • CentOS/RHEL/Alibaba Cloud Linux: sudo systemctl reload httpd

    • Debian/Ubuntu: sudo systemctl reload apache2

参考: Web キャッシュの仕組み

Web キャッシュを理解することは、Apache を正しく設定するのに役立ちます。Web キャッシュは、主に強力なキャッシュネゴシエーションキャッシュの 2 種類に分けられます。

  • 強力なキャッシュ: ブラウザがリソースをリクエストする際、まずローカルキャッシュを確認します。キャッシュが期限切れでない場合 (Cache-Controlmax-age ディレクティブ、または Expires ヘッダーで判定)、ブラウザはサーバーに接続せずにローカルキャッシュからリソースをロードします。HTTP ステータスコードは通常、200 (from disk cache) または 200 (from memory cacheです。これは最も効率的なキャッシュ方法です。

  • ネゴシエーションキャッシュ: 強力なキャッシュが無効 (期限切れ) または設定されていない場合、ブラウザはサーバーに条件付きリクエストを送信して、キャッシュされたバージョンがまだ有効かどうかをチェックします。このプロセスには以下のステップが含まれます。

    1. ブラウザは、ヘッダーにキャッシュ識別子 (以前のレスポンスの ETag 値を持つ If-None-Match や、以前のレスポンスの Last-Modified 日付を持つ If-Modified-Since など) を含めてリクエストを送信します。

    2. サーバーはこれらの識別子をリソースの現在のバージョンと比較します。

    3. リソースが変更されていない場合、サーバーは空のレスポンス本文とともに 304 Not Modified HTTP ステータスコードを返します。ブラウザはその後、ローカルの古いコピーを引き続き使用します。

    4. リソースが更新されている場合、サーバーは新しいリソースコンテンツとともに 200 OK HTTP ステータスコードを返します。

Apache を設定することで、以下の主要な HTTP レスポンスヘッダーを制御して、キャッシュポリシーを実装できます:

キャッシュ関連の HTTP レスポンスヘッダー

レスポンスヘッダー

説明

一般的なディレクティブ/値

Cache-Control

HTTP/1.1 で導入され、キャッシュ動作をきめ細かく制御します。Expires より優先されます。

public: 任意のキャッシュ (ブラウザ、CDN) で保存できます。

private: エンドユーザーのブラウザでのみキャッシュできます。

no-cache: ネゴシエーションキャッシュを強制します。毎回サーバーで検証が必要です。

no-store: キャッシュを完全に無効化します。一切のコピーを保存しません。

max-age=<seconds>: 強力なキャッシュの有効期間を秒単位で設定します。

s-maxage=<seconds>: CDN などの共有キャッシュ専用の max-ageです。

must-revalidate: キャッシュ期限切れ後、オリジンサーバーで検証が必要です。古いコピーは使用できません。

immutable: キャッシュが新鮮な間はレスポンスボディが変更されないことを示します。ブラウザが条件付きリクエストの送信をスキップできます。

Expires

HTTP/1.0 の古い標準で、キャッシュの絶対的な有効期限をタイムスタンプで指定します。Cache-Control: max-age が存在する場合、このヘッダーは無視されます。

Expires: Wed, 21 Oct 2025 07:28:00 GMT

ETag

エンティティタグ (Entity Tag) は、ファイルコンテンツのハッシュなど、サーバーがリソースに対して生成する一意の識別子です。ETag は Last-Modified よりも精度が高いです。

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

Last-Modified

リソースがサーバー上で最後に変更された時刻。精度が低く (秒単位の精度)、ファイルのコンテンツは変わらずにメタデータのみが変更された場合など、特定のシナリオでは不正確になることがあります。

Last-Modified: Wed, 21 Oct 2025 07:28:00 GMT