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

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

最終更新日:Sep 04, 2026

Apache で Web キャッシュポリシーを設定すると、ブラウザーやコンテンツデリバリーネットワーク (CDN) などの中間プロキシがダウンロードしたリソースを再利用できるようになり、不要なネットワークリクエストが削減されます。これにより、サーバー負荷と帯域幅消費量を削減しながら、ページロード速度が向上します。

説明

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

Apache モジュールの選択

Apache モジュール

利点

欠点

ユースケース

mod_expires

構文がシンプルです。さまざまなファイルタイプに対して、有効期限を迅速に設定できます。

機能は限定的です。Cache-Control の no-store や immutable のようなディレクティブは設定できません。

シンプルなキャッシュ期間 (max-age) を設定することで、ブラウザや CDN にファイルの再利用期間を指示します。

mod_headers

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

その構文は mod_expires よりも複雑です。

きめ細かい包括的なキャッシュ戦略を必要とする本番環境。

操作手順

モジュールの有効化

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

  • モジュールがロードされているかを確認するには、 apachectl -M または httpd -M コマンドを実行します。 headers_module と expires_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_expires と mod_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:ファイルの形式を説明します。メインタイプとサブタイプをスラッシュで区切り、 image/jpeg や text/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-Control や Expires など、操作する 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-Control の max-age ディレクティブまたは Expires ヘッダーによって判断されます)、ブラウザはサーバーに問い合わせることなくローカルキャッシュからリソースを読み込みます。HTTP ステータスコードは通常、 200 (from disk cache) または 200 (from memory cache) です。これは最も効率的なキャッシュ方法です。

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

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

    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

エンティティタグ (ETag) は、ファイルの内容のハッシュなど、リソース用にサーバーによって生成される一意の識別子です。 ETag は Last-Modified よりも正確です。

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

Last-Modified

リソースがサーバーで最後に変更された時刻です。精度が低く (秒単位の精度)、ファイルメタデータは変更されてもコンテンツは変更されない場合など、一部のシナリオでは不正確になる可能性があります。

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