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=86400OK! 無事キャッシュ期間が1日になり、Expireヘッダも消えました。
お疲れ様でした!




Discussion