特定のヘッダーに基づいて Varnish キャッシュをバイパスする方法

特定のヘッダーに基づいて Varnish キャッシュをバイパスする方法

2日前からこれに取り組んでいますが、うまくいきません。

つまり、基本的には、特定の受信リクエスト URL の Varnish キャッシュをバイパスしたいのです。

私は次のようなルールを定義しました:

sub vcl_recv {
     if (req.url ~ "/en/reading-books/") { return(pass); }
}

しかし、ページを更新すると、まだキャッシュされており、応答ヘッダーは以下を返します。

via: 1.1 varnish-v4
x-varnish: 2

このバックグラウンド実行コマンドは出力を生成します:

varnishncsa -F '%{Host}i %h %l %u %t "%r" %s %b "%{Referer}i" "%{User-agent}i"'

ここで何が欠けているのでしょうか? 何かご指摘いただければ幸いです。

答え1

サポートされているバージョンにアップグレードする

受信URLのキャッシュのデバッグについて話す前に、次の点を指摘しておきたい。既知のセキュリティ上の脆弱性がある Varnish のサポート終了バージョンを実行している

最新バージョンにアップグレードするか、Varnish Cache 6.0 LTS を使用してください。

見るhttps://www.varnish-software.com/developers/tutorials/#installationsさまざまな Linux ディストリビューションのインストール ガイドの一覧。

正確なURLまたはURLパターンの一致

共有した VCL コードは、 のキャッシュをバイパスします/en/reading-books。その URL の完全一致を試みていますか、それとも URL のセットに一致するパターンを試みていますか?

完全一致にするには、URL を次のように調整します。

sub vcl_recv {
    if (req.url == "/en/reading-books/") { 
        return(pass); 
    }

}

すべて で始まる複数の URL を一致させる場合は/en/reading-books/、VCL を次のように調整します。

sub vcl_recv {
    if (req.url == "^/en/reading-books/.*$") { 
        return(pass); 
    }

}

Varnish固有のレスポンスヘッダーについて

質問の中で次のヘッダーについて言及しました:

via: 1.1 varnish-v4
x-varnish: 2

これらは Varnish を使用していることを示しますが、必ずしも Varnish がキャッシュからの応答を提供するというわけではありません。

ヘッダーviaは、Varnish が応答チェーン内のプロキシ サーバーであるという事実をユーザーに通知するだけです。

ヘッダーの値はx-varnish通常、リクエストを処理したトランザクションの ID を参照します。

Age実際には、応答がキャッシュから提供されている期間を示すヘッダーです。

ログを確認する

このvarnishncsaコマンドは Varnish 共有メモリ ログにアクセスできますが、実際には多くの有用なキャッシュ情報を表示しません。

の目的はvarnishncsa、Apache や Nginx が返すものと同様のアクセス ログ情報を返すことです。

キャッシュをデバッグするには、次のコマンドを実行してください。

varnishlog -g request -q "ReqUrl ~ '^/en/reading-books/.*$'"

varnishncsaNCSA 形式の 1 行の応答を生成しますが、varnishlog完全なトランザクションを返します。 からの出力をvarnishlog質問に追加していただければ、デバッグをお手伝いします。

関連情報