RitoLabo

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

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