サーバーをリプレースしたらキャッシュが機能しない!助けて!と問い合わせがあったので、調べたらETagを使っていた。
スポンサーリンク
目次
複数サーバ構成でETag利用
apacheやIISはETagを「iNode」+「ファイルサイズ」+「更新日時」で生成している。
そのため、複数サーバ構成でLBでバランシングするような構成だと、inodeが変わるのでETagのハッシュ値が変わってキャッシュが効かなくなる。
(同じサーバに割り振られ続ければ問題はないが)
対策1
ETagの実装をやめて、Last-Modified および If-Modified-Sinceでキャッシュを実装する。
※ETag/If-None-MatchはLast-Modified/If-Modified-Sinceより優先度が高い。
対策2
WebサーバのETag生成ルールを変更して、「iNode」を使わなくする
ちなみに、apache・IISはデフォルトでiNodeを使う。nginxはデフォルトで使わない(ファイルサイズ+更新日時で生成)
参考サイト
静的ファイルのキャッシュコントロールについて ISUCON7 – そろそろちゃんとやります
Last-Modified および If-Modified-Since
HTTPキャッシュ。なぜ嫌われるのか。 – それマグで!
If-None-Match
DSAS開発者の部屋:負荷分散環境でブラウザキャッシュが効かないときは – ETagの解説 –