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」ディレクトリに移動してやればOK。

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

cache-control: max-age=86400

OK! キャッシュ期間が1日になり、Expireヘッダも消えました。

シェアする

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

フォローする