私が「リソース」を持っていると仮定すると、頻繁にアクセスされるため、Varnishによって常にhttp://localhost/doc
キャッシュされると予想されます。ただし、誰かがPOSTを介して更新した場合を除き、POSTの更新が終了した後、それ以降のすべてのリクエストで最新バージョンの「 doc」。
POSTリクエストはデフォルトでキャッシュなしでVarnishを通過するため、私の考えはこのロジックをバックエンドサーバー内にラップすることです。バックエンドサーバーでは次のことができます。
- コマンドを実行する:
varnishadm -T 127.0.0.1:6082 purge req.url == "/doc"
- 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を使用してこれを実現するためのベストプラクティスは何ですか?
ご回答ありがとうございます!