2

stale-if-errorサーバーが の外観gracekeepオブジェクト オプションで異常とマークされている間に、古いコンテンツを配信するために使用していますvcl_hit

問題は、vcl サブルーチンに入った後でキャッシュ オブジェクトを配信できるかどうかですvcl_backend_error(フレッシュ リクエスト エラー)。実際、キャッシュされたオブジェクトを に配信しますvcl_hitが、次の図を見ると、そのリクエストのキャッシュされたオブジェクトにアクセスする方法がわかりません。

https://www.varnish-software.com/book/4.0/chapters/VCL_Basics.html

ソース: https://www.varnish-software.com/book/4.0/chapters/VCL_Basics.html

4

1 に答える 1

3

組み込みの 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);
}
于 2015-10-06T12:55:27.920 に答える