1. Home
  2. Linux
  3. Apache
  4. 【WEBアプリ高速化】Apacheのキャッシュモジュール「mod_expires」「mod_cache」「mod_cache_disk」を使いキャッシュを設定する

【WEBアプリ高速化】Apacheのキャッシュモジュール「mod_expires」「mod_cache」「mod_cache_disk」を使いキャッシュを設定する

  • 公開日
  • 更新日
  • カテゴリ:Apache
  • タグ:Linux,Apache,Amazon Linux,Google PageSpeed Insights,mod_expires,mod_cache,mod_cache_disk,httpd,4.2,cache,module,Tuning
【WEBアプリ高速化】Apacheのキャッシュモジュール「mod_expires」「mod_cache」「mod_cache_disk」を使いキャッシュを設定する

今回は、Apache のキャッシュモジュールである「mod_expires 」「mod_cache 」「mod_cache_disk 」を使い、 クライアントサイド(ブラウザ)キャッシュとサーバーサイドキャッシュを設定します。
静的リソースの HTTP ヘッダー内で、有効期日や最大経過時間を設定すると、 ブラウザがネットワークからではなくローカルディスクから以前にダウンロードしたリソースを読み込むようになり、WEB ページの表示高速化につながります。
通常このしくみをクライアントサイドキャッシュと言いますが、この効果が現れるのは2回目のアクセスからです。
今回は同時に、サーバーサイドキャッシュも設定し、初回のアクセス時にもキャッシュが効くようにします。
キャッシュから読み込まれるリソース分、HTTP リクエストが無くなるため、サーバ負荷の軽減にもなります。 例えばブログサイトの画像であったり、 常に変動しないようなものに設定すると表示の高速化につながりますので是非設定しておきたいところです。

尚、今回のデモンストレーションは linux CentOS7 ですが、Amazon Linux でも同様の手順で設定できます。
Apache のバージョンは 2.4 です。

各モジュールについて

まず、それぞれのモジュールの役割ですが以下のようになります。

mod_cache
キャッシュの扱い方を設定するモジュール
mod_cache_disk
どのキャッシュをどこへ保存するかを設定するモジュール
mod_expires
キャッシュの期限を設定するモジュール

モジュールがロードされているか確認

まずは各モジュールがロードされているか確認します。 「/etc/httpd/conf.modules.d/」にある「00-base.conf 」を vim コマンドで開きます。

# vim コマンドを使って「00-base.conf 」を開く
vim /etc/httpd/conf.modules.d/00-base.conf

開いたら、以下の記載がある事を確認します。コメントアウトされている場合は、外します。
もし記述がなければそのモジュール自体が入っていないので、導入する必要があります。
(とはいえ、通常であれば Apache 2 系ならデフォルトで入っています。のはず。)

LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so
LoadModule expires_module modules/mod_expires.so

コメントアウトなく記述があれば確認 OK 。
コメントアウトされていた場合は外し、一度 Apache を再起動します。

# Apache 再起動
service httpd restart

モジュールの設定

ではモジュールの設定を行っていきます。今回は、専用に conf ファイルを作成して記述していきます。

  • 場所
    • /etc/httpd/conf.d
  • ファイル名
    • mod_cache_setting.conf
# vim コマンドを使って「mod_cache_setting.conf 」を開く
vim /etc/httpd/conf.d/mod_cache_setting.conf

ファイルを(作成)開いたら、以下を記述します。

<IfModule mod_cache.c>
  <IfModule mod_cache_disk.c>
    CacheRoot /var/tmp/cache
CacheEnable disk /
</IfModule>
  CacheIgnoreCacheControl On
CacheIgnoreNoLastMod On
CacheDefaultExpire 86400
  CacheMaxExpire 2592000
</IfModule>
<ifModule mod_expires.c>
  ExpiresActive On
# Default
  ExpiresDefault "access plus 0 seconds"
  # JavaScript
  ExpiresByType text/js "access plus 1 month"
  ExpiresByType text/javascript "access plus 1 month"
  ExpiresByType application/javascript "access plus 1 month"
  ExpiresByType application/x-javascript "access plus 1 month"
  # CSS
  ExpiresByType text/css "access plus 1 month"
  # images
  ExpiresByType image/gif "access plus 1 month"
  ExpiresByType image/png "access plus 1 month"
  ExpiresByType image/jpg "access plus 1 month"
  ExpiresByType image/jpeg "access plus 1 month"
  ExpiresByType image/svg+xml "access plus 1 month"
  # Favicon and cursor images
  ExpiresByType image/x-icon "access plus 1 month"
  # PDF
  ExpiresByType application/pdf "access plus 1 month"
  # Fonts
  ExpiresByType application/x-font-ttf "access plus 1 month"
  ExpiresByType application/x-font-woff "access plus 1 month"
  ExpiresByType application/x-font-opentype "access plus 1 month"
  ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
</ifModule>

上記の記述に関して、上から説明します。

CacheRoot
キャッシュを保存する場所をフルパスで指定します。
CacheEnable
キャッシュストレージタイプを指定します。
mem /manual
メモリ
disk /
ディスクストレージ
fd /images
より細かく設定する場合
CacheIgnoreCacheControl
強制的にキャッシュを返す設定。
クライアントからのリクエストに「no-cache」の値、つまり、 キャッシュされているデータを返すなとあってもそれを無視し、キャッシュを返す設定。
CacheIgnoreNoLastMod
Last-Modifiedが指定されていないドキュメントでもキャッシュするようになる。(通常ではLast-Modified による最終修正時刻の無いドキュメントはキャッシュされない)
CacheDefaultExpire
デフォルトのキャッシュ期限。秒で記述します。ここでは1日に設定しています。
CacheMaxExpire
キャッシュの最大保持期限。秒で記述します。ここでは1ヵ月に設定しています。
ExpiresActive
モジュールの機能を有効・無効にする設定。ここではONにしています。
ExpiresDefault
デフォルトの有効期限。
ExpiresByTypeディレクティブで指定していないものの有効期限はここで設定されます。今回の場合は、指定のないものに関してはキャッシュを効かせない設定にする為、0秒を指定しています。
ExpiresByType
キャッシュの有効期限を指定。MIMEタイプと有効期限を記述します。
有効期限には、以下の書式が使えます。
  • months
  • weeks
  • days
  • hours
  • minutes
  • seconds

ちなみに今回は、Google Developers / PageSpeed Insights のガイドラインに沿って設定してみました。
主なルールはおおよそ、以下の通り

  • キャッシュ有効期限は、1週間以上1年以内で設定
  • 有効期限は、1 年以上先には設定しない(RFC のガイドラインに違反する)
  • HTML はキャッシュさせない
  • 基本的にはある程度長めに設定をして、変更がある場合には URL フィンガープリントで対応する

記述が終わったらファイルを閉じて、記述・書式が正しいかテストを行います。

httpd -t
Syntax OK ←これが出れば OK

次に、CacheRoot ディレクティブで指定した場所へ、キャッシュを格納するためのディレクトリを作成します。

mkdir /var/tmp/cache

作成したディレクトリの所有者を apache へ変更します。

chown apache:apache /var/tmp/cache

設定を適用させる為、Apache を再起動します。

# Apache 再起動
service httpd restart

まとめ

以上で設定は完了です。サーバーサイドのキャッシュが正しく行われているかどうかは、CacheRoot ディレクティブで指定した場所を見てキャッシュが生成されていれば確認できます。
最後に一点、キャッシュの有効期限に関しては慎重に決めてください。公開しているページに 一度キャッシュを設定すると、クライアントには有効期限に達するまでキャッシュが表示されます。
更新される頻度などと相談して上手に調整していく事が大切です。

Author

rito

  • Backend Engineer
  • Tokyo, Japan
  • PHP 5 技術者認定上級試験 認定者
  • 統計検定 3 級