Dockerのphp:7-apacheコンテナで、ディレクトリ毎にキャッシュ期間を設定する方法

httpサーバを運用する場合、ファイルの拡張子別にキャッシュ期間をコントロールする方法がよく用いられますが、今回の案件ではディレクトリ毎にキャッシュを調整したいので、その方法を調べてみました。

現在稼働中のサーバは、Dockerで運用されていまして、php:7-apacheをベースにしたコンテナが走っています。

Apacheの場合、.htaccessを使うことで、ディレクトリ別に設定を変更できますが、キャッシュについても設定できるようです。

まずは、サーバから出力されている画像のヘッダを確認してみました。

cache-control: max-age=31536000
expires: Tue, 01 Dec 2020 06:13:40 GMT

わお、ブラウザに1年もキャッシュされる設定になっていました。

一概にこれが長いとは言えませんが、今回の案件においては、長すぎますので、これを1日に変更していきます。

ブラウザキャッシュを1日に設定したいディレクトリに .haccsess を置き、以下のように記述します。

Header set Cache-Control "max-age=86400"
Header unset Expires
Header unset ETag

ブラウザに向けたキャッシュの指定方法として、Cache-ControlヘッダとExpireヘッダがありますが、両方設定されていた場合、Cache-Controlの指定が優先されます。

これまでは、一部のブラウザはCache-Controlをサポートしていないので、両方設定しておきましょうと言われていましたが、さすがにもうExpireは必要ないと思われます。そのようなブラウザは、現在のSSL通信に対応できていないので、 サイトへのアクセスが そもそも 出来ないためです。

Cache-ControlとExipireでキャッシュ期間の不整合があると気持ち悪いので、Expireヘッダーは削除してしまいましょう。

さらに、 サーバを複数台で構成した場合に備えて Etagも削除しておきます。Etagはファイルのバージョンをチェックして、更新されていれば再読み込みをするという仕組みなのですが、複数台構成にすると、例え同じファイルであっても異なるEtagを送出して、無駄な再読み込みが発生してしまうためです。

これでOK!と意気込んでテストするも、無常の Internal Server Error!

あらら、「mod_headers」が無効になっているのかしら。

というわけで、Dockerfileを以下のように書き換えます。

FROM php:7-apache
...
(略)
...

# これを追記
# Apache2 mod headers
RUN mv /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load

「headers.load」を「mods-available」ディレクトリから「mods-enabled」ディレクトリに移動して有効化してやります。

ビルドし直したイメージでコンテナを立ち上げたら、ブラウザで再度同じ画像を読み込んでみます。

cache-control: max-age=86400

OK! 無事キャッシュ期間が1日になり、Expireヘッダも消えました。
お疲れ様でした!

シェアする

  • このエントリーをはてなブックマークに追加

フォローする