組み込みの VCL を使用する場合(以下のコードを参照):
# Built-in 'vcl_hit'.
sub vcl_hit {
if (obj.ttl >= 0s) {
return (deliver);
}
if (obj.ttl + obj.grace > 0s) {
return (deliver);
}
return (fetch);
}
duringvcl_backend_error
によってトリガーされたバックグラウンド/非同期バックエンド フェッチが に達した場合、心配する必要はありません。停止したオブジェクトを更新するのは単なるバックグラウンド スレッドです。停止したコンテンツは、既にクライアントに配信されています。return (deliver)
vcl_hit
duringvcl_backend_error
によってトリガーされた同期バックエンド fetch が に達した場合も、心配する必要はありません。クライアントにエラーが配信されますが、選択の余地はありません。失速したオブジェクトは Varnish ストレージでは利用できません。return (fetch)
vcl_hit
vcl_hit
ただし、バックエンドが正常なときに猶予を制限するようにカスタマイズした場合(以下の VCL サンプル コードを参照)、return (fetch)
実行された duringvcl_hit
は同期バックエンド リクエストとして処理されます。クライアントはバックエンドの応答を待ちます。バックエンド リクエストが到達vcl_backend_error
すると、クライアント側にエラーが配信されます。停止したオブジェクトは Varnish ストレージで使用できます (この例では 60 秒以上前に停止しています) が、使用されません。
# Customised 'vcl_hit'.
sub vcl_hit {
if (obj.ttl >= 0s) {
return (deliver);
}
if (std.healthy(req.backend_hint)) {
if (obj.ttl + 60s > 0s) {
return (deliver);
}
} else {
if (obj.ttl + obj.grace > 0s) {
return (deliver);
}
}
return (fetch);
}
同期バックエンド フェッチが失敗したときに停止したオブジェクトを配信する場合は、追加の VCL ロジックが必要です。このアイデアは、次のコードに示されています。
backend fail_be {
.host = "127.0.0.1";
.port = "9000";
.probe = {
.url = "/give-me-a-non-200-please";
.interval = 24h;
.timeout = 1s;
.window = 1;
.threshold = 1;
}
}
sub vcl_recv {
# Force the non-healthy backend in case of restart because of a previous
# failed backend fetch. This will force serving stalled content using
# full grace during 'vcl_hit' (if possible).
if (req.restarts == 0) {
unset req.http.X-Varnish-Restarted-5xx;
} else {
if (req.http.X-Varnish-Restarted-5xx) {
set req.backend_hint = fail_be;
}
}
# ...
}
sub vcl_synth {
# 503 generated for synchronous client requests when abandoning the
# backend request (see 'vcl_backend_fetch') and not executing a POST.
if (resp.status == 503 &&
req.method != "POST" &&
!req.http.X-Varnish-Restarted-5xx) {
set req.http.X-Varnish-Restarted-5xx = "1";
return (restart);
}
# ...
}
sub vcl_backend_fetch {
if (bereq.retries == 0) {
unset bereq.http.X-Varnish-Backend-5xx;
} else {
if (bereq.http.X-Varnish-Backend-5xx) {
# Jump to 'vcl_synth' with a 503 status code.
return (abandon);
}
}
# ...
}
sub vcl_backend_response {
if (beresp.status >= 500 && beresp.status < 600) {
set bereq.http.X-Varnish-Backend-5xx = "1";
return (retry);
}
# ...
}
sub vcl_backend_error {
set bereq.http.X-Varnish-Backend-5xx = "1";
return (retry);
}