【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

今回は、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 ディレクティブで指定した場所を見てキャッシュが生成されていれば確認できます。
最後に一点、キャッシュの有効期限に関しては慎重に決めてください。公開しているページに 一度キャッシュを設定すると、クライアントには有効期限に達するまでキャッシュが表示されます。
更新される頻度などと相談して上手に調整していく事が大切です。