在VCL中使用清漆计数器MAIN。*

时间:2016-06-06 08:55:41

标签: varnish varnish-vcl

是否可以在条件中使用VCL中的清漆计数器?

我想根据MAIN.backend_conn的当前值写一个条件,但我无法弄清楚,即使在内联C中我是否可以在VCL中使用统计信息。

当前解决方案

现在我正在使用这样的配置:

backend default {
    .host = "192.168.122.11";
    .probe = {
        .url = "/check-connections.php";
        .interval = 1s;
        .threshold = 4;
    }
}

backend sessionWorker {
    .host = "192.168.122.11";
    .probe = {
        .url = "/other-probe";
        .interval = 5s;
        .threshold = 2;
    }
}

sub vcl_recv {
    if (req.http.cookie ~ "(^|;\s*)(SESS=)" || std.healthy(req.backend_hint)) {
        set req.backend_hint = sessionWorker;
    } else {
        return (synth(503, "Server overloaded"));
    }
}

check-connections.php读取nginx状态 - 活动连接并触发错误,如果有更多活动连接:

if ($active > 10) {
    http_response_code(502);
} else {
    http_response_code(200);
}

我想找到一个解决方案,如何将当前连接(VBE.c​​onn)的std.healty(req.backend_hint)替换为直接在VCL中的后端。

1 个答案:

答案 0 :(得分:0)

已经实施了一些计数器。像bereq.retries

sub vcl_backend_response {
  if (beresp.status == 503 && bereq.retries < 5 ) {
    return(retry);
  }
}

sub vcl_backend_error {
  if (beresp.status == 503 && bereq.retries == 5) {
    synthetic(std.fileread("/path/to/my/file/varnish503.html"));
    return(deliver);
  }
}

也许这已经是你需要的了。否则here是其他内置计数器的列表。