2017-02-11
Nginxがstale-while-revalidateに対応した
20170214 追記
このコミット(URL)で入った proxy_cache_background_update で、stale-while-revalidateを使わなくてもバックグラウンドでキャッシュ更新するように設定できるようになる模様
このコミット(URL)で、Nginxのproxy_cache機能がstale-while-revalidateとstale-if-errorに対応した。次のNginxのバージョンで使えるようになるだろう。
stale-while-revalidate、stale-if-errorとは
stale-while-revalidateとは、以前「Cache-Controlヘッダのstale-while-revalidateとは」で書いたとおり、Cache-Controlヘッダで指定できる拡張機能である(RFC)。
max-ageでキャッシュが切れたあとに、指定した期間の間それぞれ以下の挙動をする
- stale-while-revalidate: 一旦キャッシュを使用して、その後にファイルが更新されてないか確認しに行く。まずはキャッシュを使うので待ち時間が少ない
- stale-if-error: ネットワークエラーがあった場合のみ、キャッシュを使用する
以下のように指定する
Cache-Control: max-age=600, stale-while-revalidate=30
max-age(600sec)後に、30secの間はキャッシュを使用した後にファイルが更新されているか確認し、キャッシュの更新をする。
Nginxの場合
この機能はリバースプロキシ・バックエンドサーバ間でも使用できます。
Nginx側の設定に特殊なことは必要ない。デフォルトでこの機能は有効になっている。
proxy_cache_path /tmp keys_zone=zone:10m; server { listen 80; server_name localhost; location / { proxy_pass http://localhost:8080; proxy_cache zone; ...
初回アクセス
初回は普通にリバースプロキシする。バックエンドはHTTPレスポンスにstale-while-revalidateなどを付与する。
Nginxはそのコンテンツをキャッシュする。
stale-while-revalidate、max-age経過後
手元のキャッシュを使用してから、ファイルが更新されてないか確認しに行く。
stale-if-error、max-age経過後
エラーがあった場合のみ手元のキャッシュを使用する。そうでなければいつもどおりに処理する
それぞれ動作確認したところ、上記のように動作していたが。デモが非常にわかりにくいので割愛するorz
- 28 https://www.google.co.jp/
- 3 https://t.co/wqJEeM45lP
- 3 https://www.google.com/
- 2 http://reader.livedwango.com/reader/
- 2 http://search.yahoo.co.jp/
- 1 http://hatenablog.com/k/keywordblog/MPTCP
- 1 http://qiita.com/bj1024/items/3a4029f7ca2383d7a641
- 1 http://websearch.rakuten.co.jp/Web?tool_id=1&ref=chext&qt=tls1.3&col=OW
- 1 http://www.bing.com/search?q=httpsプロトコル ネゴシエーション&qs=n&form=QBRE&sp=-1&pq=httpsプロトコル+ネゴ%
- 1 http://www.google.com