開発サーバーで実行されている varnishsetup (Varnish 3) と、運用サーバーで同じセットアップがあります。テストしない限り、開発サーバーにはトラフィックがありません。productionserver は、その varnishinstance を通過する約 80 の Web サイトの大量のトラフィックを取得します。Web サイトはまったく同じなので、すべての Web サイトに対して 1 つの VCL で十分です。
現在、URL スマート禁止と ban_lurker でテストしています。
私が期待しているのは、禁止を追加すると、何らかの理由で禁止が機能しない場合でも、キャッシュ内の最大の TTL + バックエンド応答猶予期間だけ禁止リストに残るはずです。
問題
問題は、私の運用サーバーでは、代わりに禁止が永久に禁止リストに残ることです (または、それがなくなるように指定した時間であるため、少なくとも 24 時間)。
そのため、vcl_fetch から 20 分を強制し、beresp.grace を 0 に強制するため、キャッシュ オブジェクトが 20 分よりも長くキャッシュにとどまることは不可能であると予想されるように、VCL を微調整しました。
私の開発用 varnishserver では、これはまさにそのように機能するようです。ウェブサイトをクリックしてそのようにキャッシュしてから禁止すると、予想どおり20分で消えてしまいます. 私の運用サーバーでは、これは禁止リストにまったく影響を与えないようです。それはただそこにとどまります。
私はそこに何かが恋しいですか??
VCL
誰かが私の VCL を見て、私が間違っていることを教えてもらえますか? バックエンド構成やパージ/禁止構成などの一部を省略したことに注意してください。それは今のところ問題ではないと思うからです。私が間違っている場合は修正してください:)
import std;
# Define backends
include "backends.vcl";
# Define recv basics
sub vcl_recv {
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE" &&
req.request != "PURGE" &&
req.request != "BAN") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
}
# Define purging and banning rules
include "purging-banning.vcl";
# Appart from PURGE and BAN requests, we only handle GET and HEAD requests
sub vcl_recv {
if (req.request != "GET" && req.request != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
# Never cache monitor.php
if (req.url ~ "^/monitor.php") {
return (pass);
}
# in case of down backends serve content up to 30 minutes old
if (req.backend.healthy) {
set req.grace = 2m;
} else {
set req.grace = 30m;
}
}
# Define purging and banning rules
include "recv-url-rules.vcl";
# If the URL's hasn't been caught by recv-url-rules.vcl, continue with common rules
sub vcl_recv {
# Don't cache AJAX requests
if (req.http.X-Requested-With == "XMLHttpRequest") {
return(pass);
}
}
sub vcl_fetch {
# Set default TTL of 20 minutes
set beresp.ttl = 20m;
# Keep objects in cache beyond their lifetime
set beresp.grace = 0s; # for testing purposes
# Don't cache if requested so by the server
if (beresp.http.X-NoCache == "no-cache" || beresp.http.cache-control ~ "private") {
set beresp.ttl = 0s;
set beresp.http.Cache-Control = "max-age = 0";
return ( hit_for_pass );
}
# Pass (don't cache) big files (limit is just under 1MB)
if ( beresp.http.Content-Length ~ "[0-9]{6,}" ) {
set beresp.ttl = 0s;
return ( hit_for_pass );
}
# Remember URL and HOST for the ban-lurker
set beresp.http.x-url = req.url;
set beresp.http.x-host = req.http.host;
}
sub vcl_deliver{
# These were set for the ban-lurker, but don't have to be send to the client
unset resp.http.x-url;
unset resp.http.x-host;
# Add a header to the request so that we can see wether or not the object came from cache
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
}
sub vcl_pipe {
# http://www.varnish-cache.org/ticket/451
# This forces every pipe request to be the first one.
set bereq.http.connection = "close";
}
ニスのドキュメント
Varnish のドキュメントには次のように記載されています。
Varnish が vcl_fetch を実行する前に、beresp.ttl 変数はすでに値に設定されています。>次の中で最初に見つかった値を使用します。
Cache-Control 応答ヘッダーの s-maxage 変数 Cache-Control 応答ヘッダーの max-age 変数 Expires 応答ヘッダー default_ttl パラメータ。
場合によってはバックエンドの応答によって TTL がまだ上書きされている可能性はありますか? vcl_fetchで強制しても?