varnish4 vs varnish3 - 恩典行为

时间:2017-11-02 10:57:44

标签: varnish varnish-vcl varnish-4 varnish-3

我目前正致力于从varnish3到varnish4和的迁移项目 我正面临一种我不理解的行为。

简单地说,使用Varnish3中使用的相同配置文件 和Varnish4,我没有关于命中和未命中的相同结果。

这似乎与恩典属性有关,但我不知道如何 它有效。

以下是将问题详细描述的示例:

我的varnish3配置:

# ----------------------------------------------
backend default {
    .host = "nginx";
    .port = "80";
}

sub vcl_fetch {
     set beresp.grace= 5s;
     set beresp.ttl = 1s;
}

sub vcl_deliver {
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT";
    } else {
        set resp.http.X-Cache = "MISS";
    }
    set resp.http.X-Cache-Hits = obj.hits;
}
# ----------------------------------------------

我的varnish4配置:(只有更改是方法名称 vcl_backend_response而不是vcl_fetch)

# ----------------------------------------------
vcl 4.0;

backend default {
    .host = "nginx";
    .port = "80";
}

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

sub vcl_deliver {
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT";
    } else {
        set resp.http.X-Cache = "MISS";
    }
    set resp.http.X-Cache-Hits = obj.hits;
}
# ----------------------------------------------

检索给定资源标头的小方案的结果 过了一段时间:

# ----------------------------------------------
Time 14-47-12
VARNISH4:
X-Cache: MISS
X-Cache-Hits: 0
VARNISH3:
X-Cache: MISS
X-Cache-Hits: 0

Time 14-47-13
VARNISH4:
X-Cache: HIT
X-Cache-Hits: 1
VARNISH3:
X-Cache: MISS
X-Cache-Hits: 0

Time 14-47-20
VARNISH4:
X-Cache: MISS
X-Cache-Hits: 0
VARNISH3:
X-Cache: MISS
X-Cache-Hits: 0
# ----------------------------------------------

因此,您可以在方案中看到第一个请求,包括v3和v4 返回MISS,这是正常的。 但是一秒钟之后,第二个请求返回了一个用于varnish3的MISS,其中 对我来说是正常的,对于varnish4来说是个HIT,我真的不明白。 我怀疑这与grace参数有关,我添加了一个 7秒后我的场景中的第三个请求(缓存超过1秒) 加上5秒的恩典),正如预期的那样,清漆3和清漆4 是MISS。

所以,如果有人可以帮助我理解/解决这个问题...... 我的目标是使用varnish4获得与使用相同的结果 varnish3(虽然我从3迁移到4;))。 我目前的解决方法是在varnish4上设置beresp.grace = 1ms,但我不知道 就像那样,我不能在每个配置上都这样做:(

非常感谢任何帮助!

提前致谢! :)

1 个答案:

答案 0 :(得分:2)

Varnish 4在第二个请求中提供了陈旧的对象(请参阅How objects are stored)。

我建议您阅读Grace mode,然后使用Understanding Grace using varnishtest