Hatena::ブログ(Diary)

あすのかぜ Twitter

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;
...

初回アクセス

f:id:ASnoKaze:20170211223440p:image:w480

初回は普通にリバースプロキシする。バックエンドはHTTPレスポンスにstale-while-revalidateなどを付与する。

Nginxはそのコンテンツをキャッシュする。


stale-while-revalidate、max-age経過後

f:id:ASnoKaze:20170211223711p:image:w480

手元のキャッシュを使用してから、ファイルが更新されてないか確認しに行く。


stale-if-error、max-age経過後

f:id:ASnoKaze:20170211224242p:image:w480

エラーがあった場合のみ手元のキャッシュを使用する。そうでなければいつもどおりに処理する


それぞれ動作確認したところ、上記のように動作していたが。デモが非常にわかりにくいので割愛するorz

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証