Varnish Cache v4: неверный ответ проверки работоспособности бэкэнда

Я настроил Varnish Cache (4) перед моей CMS, чтобы помочь кешировать запросы. Если моя CMS выйдет из строя, я бы хотел доставить кэшированные элементы в течение установленного льготного периода. Я следовал за многими примерами, представленными онлайн, но сталкиваюсь с проблемой, когда Varnish не распознает, что мой сервер не работает. Когда я вручную выключаю CMS, std.health(req.backend_hint)) продолжает возвращать true и пытается извлечь элемент из серверной части, который затем возвращает ответ 503.

Вопрос: я неправильно предполагаю std.health(req.backend_hint)) узнает, что моя CMS не работает?

Вот сценарий VCL, который я использовал для тестирования:

sub vcl_recv {
  # Initial State
  set req.http.grace = "none";
  set req.http.x-host = req.http.host;
  set req.http.x-url = req.url;

  return(hash);
}

sub vcl_backend_response {
    set beresp.ttl = 10s;
    set beresp.grace = 1h;
}

sub vcl_deliver {
    # Copy grace to resp so we can tell from client
    set resp.http.grace = req.http.grace;

    # Add debugging headers to cache requests
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT";
    }
    else {
        set resp.http.X-Cache = "MISS";
    }
}

sub vcl_hit {
    if (obj.ttl >= 0s) {
        # normal hit
        return (deliver);
    }
    # We have no fresh content, lets look at the cache
    elsif (std.healthy(req.backend_hint)) {
        # Backend is healthy. Limit age to 10s.
        if (obj.ttl + 10s > 0s) {
            set req.http.grace = "normal(limited)";
            return (deliver);
        } else {
            # No candidate for grace. Fetch a fresh object.
            return(fetch);
        }
    } else {
        # backend is sick - use full grace
        if (obj.ttl + obj.grace > 0s) {
            set req.http.grace = "full";
            return (deliver);
        } else {
            # no graced object.
            return (fetch);
        }
    }
}

Опять же, когда я выключаю CMS, std.healthy(req.backend_hint)) все еще сообщает о бэкэнде как о здоровом и никогда не переходит к последнему утверждению else.

Спасибо, что посмотрели.

1 ответ

Решение

Правильно использовать std.healthy вам, конечно, нужно настроить бэкэнд-зонды. Итак, в верхней части вашего VCL-файла вы должны сначала настроить зонд:

probe site_probe {
    .request =
        "HEAD / HTTP/1.1"
        "Host: example.com"
        "Connection: close";
        .interval  = 5s; # check the health of each backend every 5 seconds
        .timeout   = 3s;  # timing out after 1 second by default.
        .window    = 5;  # If 3 out of the last 5 polls succeeded the backend is considered healthy, otherwise it will be marked as sick
        .threshold = 3;
 } 

Не забудьте заменить example.com с вашим основным доменом сайта. Важно поставить (или опустить) www. префикс, так что зонд не будет перенаправлен и помечен как отказавший.

И, конечно, ваше бэкэнд-определение должно быть настроено на использование определенного зонда:

backend default {
    .host = "127.0.0.1";
    .port = "8080";
    .probe = site_probe;
}
Другие вопросы по тегам