1

私が「リソース」を持っていると仮定すると、頻繁にアクセスされるため、Varnishによって常にhttp://localhost/docキャッシュされると予想されます。ただし、誰かがPOSTを介して更新した場合を除き、POSTの更新が終了した後、それ以降のすべてのリクエストで最新バージョンの「 doc」。

POSTリクエストはデフォルトでキャッシュなしでVarnishを通過するため、私の考えはこのロジックをバックエンドサーバー内にラップすることです。バックエンドサーバーでは次のことができます。

  1. コマンドを実行する:varnishadm -T 127.0.0.1:6082 purge req.url == "/doc"
  2. HTTPパージリクエストを起動します。curl -X PURGE http://localhost/doc

Cache-Controlただし、 " "ヘッダーを尊重するようにVCLを構成する必要があります!私のVCLは以下のようなものですが、機能しません。

sub vcl_fetch {
    if (beresp.http.Cache-Control ~ "no-cache") {
        purge;
    }
    return (deliver);
}
acl purgers { "127.0.0.1"; }

sub vcl_recv {
    if (req.request == "PURGE") {
        if (!client.ip ~ purgers) {
            error 405 "Method not allowed";
        }
        return (lookup);
    }
}
sub vcl_hit {
    if (req.request == "PURGE") {
        #purge;
        purge("req.url ~ " req.url); 
        error 200 "Purged";
    }
}
sub vcl_miss {
    if (req.request == "PURGE") { 
        purge;
        error 200 "Purged";
    }
}
sub vcl_pass {
    if (req.request == "PURGE") {
        error 502 "PURGE on a passed object";
    }
}

それは不満です:

Message from VCC-compiler:
Expected ';' got '('

(program line 174), at
('input' Line 154 Pos 14)
        purge("req.url ~ " req.url); 
-------------#-----------------------

Running VCC-compiler failed, exit 1

VCL compilation failed
  • 質問1:目標を達成するためにVCLを更新するにはどうすればよいですか?
  • 質問2:これは非常に一般的なシナリオだと思います。リソースを最新の状態に保ちながらキャッシュします。それでは、Varnishを使用してこれを実現するためのベストプラクティスは何ですか?

ご回答ありがとうございます!

4

1 に答える 1

0

アプリケーション サーバーは、ドキュメントが更新されたときに URL を削除するように要求できます。ドキュメントの GET リクエストではなく、PURGE リクエストを送信する必要があります。

または、その URL を受信したときにその URL への POST を取得したときに、その URL を禁止することもできます。

于 2014-07-23T07:58:20.257 に答える