この varnish コード ブロックは何をするのでしょうか?

この varnish コード ブロックは何をするのでしょうか?

このコードは varnish config にありますが、何をするのかよくわかりません。この構成はクライアントのリクエストをキャッシュするかどうか? 何が問題なのでしょうか?

sub vcl_backend_response {
    if (beresp.status != 200) {
        return (pass);
    }
    set beresp.http.X-Backend = beresp.backend.name;


    unset beresp.http.cookie;
    unset beresp.http.Set-Cookie;

    if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
        set beresp.http.Cache-Control = "no-store";
    }

    set beresp.http.Cache-Control = "no-store";
    if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
        return (pass);
    }

    return (deliver);
}

答え1

この VCL コード ブロックは、キャッシュをバイパスするタイミングに関するいくつかのルールを指定しているようです。ただし、その記述方法はあまり意味がありません。

キャッシュをバイパスする

return(pass)コンテキスト内でキャッシュをバイパスする適切な方法ではありませんvcl_backend_response。着信リクエストがキャッシュをバイパスするときreturn(pass)に使用されます。vcl_recv

vcl_backend_responseキャッシュをバイパスするということは、受信オブジェクトがキャッシュに保存されないようにすることを意味します。ベスト プラクティスではset beresp.uncacheable = true、 を実行し、TTL を割り当ててから を実行することが推奨されreturn(deliver)ています。これにより、次のバックエンド応答が必要な基準を満たすまで、このオブジェクトが一定時間キャッシュをバイパスすることが保証されます。

を有効にするとberesp.uncacheable、オブジェクトが待機リストに追加され、リクエスト統合の候補になることが保証されます。

クッキーの削除

ヒット率を向上させるには、多くの場合、Cookie を削除するのが合理的です。バックエンドのコンテキストでは、ヘッダーを削除します。これはを通じてSet-Cookie正しく実行されますが、無条件に実行されます。vcl_backend_responseunset beresp.http.Set-Cookie

つまり、いかなるSet-Cookieアクションも実行されず、動作に一貫性がなくなる可能性があります。これらの Cookie を削除するには前提条件が必要かどうかは不明です。

を通じて受信 Cookie を削除することもできます。ただし、を実行するunset req.http.Cookie同様の呼び出しがあるようです。vcl_backend_responseunset beresp.http.Cookie

Cookieこれは、応答ヘッダーが受信されることを示します。これはありそうにありません。

VCLの書き換え

他のコンテキストなしでこの VCL コードを書き直すと次のようになります。

vcl 4.1;

backend default {
    .host = "127.0.0.1";
    .port = "80";
}

sub vcl_recv {
    unset req.http.Cookie;
}

sub vcl_backend_response {
    if(beresp.status != 200) {
        set beresp.ttl = 120s;
        set beresp.uncacheable = true;
        return(deliver);
    }

    set beresp.http.X-Backend = beresp.backend.name;
    unset beresp.http.Set-Cookie;
    set beresp.http.Cache-Control = "no-store";

    if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
        set beresp.ttl = 120s;
        set beresp.uncacheable = true;
        return(deliver);
    }

    return (deliver);
}

警告: これをコピーして本番環境に貼り付けることはお勧めしません。この VCL の作成時に、いくつかの手抜きが行われたように感じます。追加のコンテキストがないため、これを使用することはお勧めしません。

関連情報