Varnish 4 VCL を設定して匿名ユーザー用の特定のページのみをキャッシュする (Django を使用)

Varnish 4 VCL を設定して匿名ユーザー用の特定のページのみをキャッシュする (Django を使用)

私はDjangoとVarnish 4を使用しています。

私はそれを達成しようとしています:

  • リクエストがホームページに対するものでない場合は、パスします (現時点ではテストなどのためにホームページのみをキャッシュしようとしています)。
  • クッキー「sessionid」が存在する場合、各セッションごとに渡すかキャッシュする
  • その他:パス

サブ vcl_recv の設定は次のとおりです。

# cache only home page
    if (! req.url == "/") {
            return(pass);
    }

    # not caching if cookie sessionid is present
    if (req.http.Cookie ~ "sessionid") {
            return(pass);
    }

    unset req.http.cookie;

これまでのところ、Varnish はホームページを匿名として呼び出すときに、常に新しいページを生成しているようです。Varnish が送信するヘッダーを使用して確認できます (「age」は常に 0 で、「X-Varnish」は常に異なる番号です)。

これは、私の設定に何かが欠けているか、Django が応答で「Vary: Cookie」を送信しているためでしょうか? その場合、この場合 (匿名ユーザーのみ) Varnish から Cookie を「非表示」にするにはどうすればよいでしょうか?

答え1

問題は、Djangoが「Vary: Cookie」ヘッダーを送信したことです。いつも. 「auth」プラグインが原因だと思いますが、私はそれを調査せず、サーバーから応答が返されたときにヘッダーを削除しただけです。

Varnish のドキュメントでは、「vary: cookie」について次のように説明しています。

もう一つの不適切な使用例は、応答を区別するために Vary: Cookie のみを使用する場合です。この場合も、非常に多くの Cookie が存在する可能性があり、したがって非常に多くのキャッシュされたオブジェクトが存在する可能性がありますが、これらは元の要求者によってのみ取得される可能性が高くなります。

ソース:https://www.varnish-software.com/book/4.0/chapters/HTTP.html#vary

私の VCL 構成は次のようになります (単純なサ​​ーバー構成である上部は削除しました)。

sub vcl_recv
{
        # caching only home page
        if (! req.url == "/") {
                return(pass);
        }

        # not caching if cookie sessionid present
        if (req.http.Cookie ~ "sessionid") {
                return(pass);
        }

        unset req.http.cookie;

}

sub vcl_backend_response
{

        if (bereq.url == "/") {
                unset beresp.http.Vary;
                return(deliver);
        }
}

関連情報