19

Cookie が存在する場合でも、Varnish を使用して特定のページをキャッシュしたいと考えています。私が世話をする必要がある3つの可能性があります:

  1. 匿名ユーザーがページを表示しています
  2. ログインしているユーザーが、軽いカスタマイズでいくつかのページを表示しています。これらのカスタマイズはすべて署名付き Cookie に保存され、Javascript によって動的に入力されます。vary-cookie http ヘッダーが設定されていません。
  3. ログインしたユーザーが、データベースからのカスタマイズされたデータを含むページを表示しています。vary-cookie http ヘッダーが設定されます。

予想される動作は次のとおりです。

  1. ページをキャッシュします。これは、Varnish が処理する最も基本的なシナリオです。
  2. 一部の Javascript ロジックで Cookie が必要になるため、ページをキャッシュし、Cookie を削除しないでください。
  3. vary-cookie は、Cookie の内容がこのページの出力に影響を与えることを通知しているため、このページを決してキャッシュしないでください。

Varnish に関するいくつかのドキュメントを読みましたが、これがデフォルトの動作なのか、それとも VCL で設定を行う必要があるのか​​わかりません。

4

1 に答える 1

19

セッションのみがすべてのクライアントに固有であり、必ずしも Cookie ではありません。

あなたが望むことは意味があり、Varnish で可能です。それは、独自の vcl を慎重に作成することだけです。default.vcl の次の部分に注意してください。

sub vcl_recv {
    ...
    if (req.http.Authorization || req.http.Cookie) {
      /* Not cacheable by default */
      return (pass);
    }
}


sub vcl_hit {
    if (!obj.cacheable) {
        return (pass);
    }
    ...
}


sub vcl_fetch {
    if (!beresp.cacheable) {
        return (pass);
    }
    if (beresp.http.Set-Cookie) {
        return (pass);
    }
    ...
}

これらの部分を独自のロジックに置き換える必要があります。つまり、独自の vcl_ 関数を定義します。デフォルトでは、Cookie を含むリクエスト (vcl_recv) とレスポンス (vcl_fetch) はキャッシュできません。バックエンド アプリケーションを最もよく知っているのはあなたであり、この特定のケースに合わせて一般的なキャッシュ ロジックを書き直す必要があります。つまり、どの場合に varnish がルックアップ、パス、または配信を行うかを定義する必要があります。

あなたのケースでは、vary-by Cookie のないページ (ケース 1 と 2) があり、キャッシュされ、すべての人 (Cookie の有無にかかわらずリクエスト) によって共有されます。vcl_recv の req.http.Cookie を気にしないでください。まったく共有できないため、vary-by Cookie を使用してページをキャッシュしません (ケース 3)。少なくとも長時間はキャッシュしません。vcl_fetch で「パス」を実行します。

于 2010-11-30T00:29:44.840 に答える