Apache で Web キャッシュポリシーを設定すると、ブラウザーやコンテンツデリバリーネットワーク (CDN) などの中間プロキシがダウンロードしたリソースを再利用できるようになり、不要なネットワークリクエストが削減されます。これにより、サーバー負荷と帯域幅消費量を削減しながら、ページロード速度が向上します。
免責事項:このトピックには、サードパーティ製品に関する情報が含まれている場合があります。Alibaba Cloud は、サードパーティ製品のパフォーマンスや信頼性について、いかなる表明も保証も行いません。これらの製品の使用から生じるいかなる潜在的な影響についても、お客様が責任を負うものとします。
Apache モジュールの選択
Apache モジュール | 利点 | 欠点 | ユースケース |
| 構文がシンプルです。さまざまなファイルタイプに対して、有効期限を迅速に設定できます。 | 機能は限定的です。 | シンプルなキャッシュ期間 ( |
| HTTP ヘッダーの完全な制御を提供し、 | その構文は | きめ細かい包括的なキャッシュ戦略を必要とする本番環境。 |
操作手順
モジュールの有効化
キャッシュポリシーを設定する前に、Apache で headers モジュールと expires モジュールが有効になっていることを確認してください。
モジュールがロードされているかを確認するには、
apachectl -Mまたはhttpd -Mコマンドを実行します。headers_moduleとexpires_moduleが出力リストに含まれていることを確認します。モジュールを有効にします:
Debian/Ubuntu の場合:
sudo a2enmod headers expires sudo systemctl restart apache2CentOS/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:時間の単位です。例:secondsminuteshoursdaysweeksmonthsyears
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:設定する値です。
設定の検証と適用
設定を変更した後、構文をチェックし、サービスの停止を避けるためにサービスをグレースフルリロードします。
設定構文を確認します。変更を適用する前に、構文チェックコマンドを実行してエラーがないことを確認します。
CentOS/RHEL/Alibaba Cloud Linux:
sudo httpd -tDebian/Ubuntu:
sudo apache2ctl -t
出力が
Syntax OKの場合、続行できます。設定を適用します (グレースフルリロードを推奨)。
reloadコマンドを使用すると、既存の接続を切断せずに新しい設定を適用できます。CentOS/RHEL/Alibaba Cloud Linux:
sudo systemctl reload httpdDebian/Ubuntu:
sudo systemctl reload apache2
参考:Web キャッシュの仕組み
Web キャッシュの仕組みを理解すると、Apache を正しく設定する上で役立ちます。Web キャッシュは、主に強力なキャッシュとネゴシエーションキャッシュの 2 種類に分けられます:
強力なキャッシュ: ブラウザがリソースをリクエストすると、まずローカルキャッシュを確認します。キャッシュの有効期限が切れていない場合 (
Cache-Controlのmax-ageディレクティブまたはExpiresヘッダーによって判断されます)、ブラウザはサーバーに問い合わせることなくローカルキャッシュからリソースを読み込みます。HTTP ステータスコードは通常、200 (from disk cache)または200 (from memory cache)です。これは最も効率的なキャッシュ方法です。ネゴシエーションキャッシュ:強力なキャッシュが無効 (期限切れ) または設定されていない場合、ブラウザーは条件付きリクエストをサーバーに送信して、キャッシュされているバージョンがまだ有効かどうかを確認します。このプロセスには、次の手順が含まれます:
ブラウザーは、ヘッダーに、
If-None-Match(前回のレスポンスのETag値) やIf-Modified-Since(前回のレスポンスのLast-Modified日付) などのキャッシュ識別子を含めてリクエストを送信します。サーバーはこれらの識別子をリソースの現在のバージョンと比較します。
リソースに変更がない場合、サーバーは空のレスポンスボディとともに
304 Not ModifiedHTTP ステータスコードを返します。これにより、ブラウザーはローカルの古いコピーを引き続き使用します。リソースが更新されると、サーバーは
200 OKHTTP ステータスコードと新しいリソースコンテンツを返します。
Apache を設定することで、キャッシュポリシー用に以下の主要な HTTP レスポンスヘッダーを制御できます: