Varnish 4 不缓存

Varnish 4 不缓存

我是 varnish 的新手。我安装了它,我认为我配置正确。为了测试,我做了以下操作:

我创建了一个仅包含字符串“test”的测试页面。我进入该页面,它有以下标题:

Accept-Ranges:bytes
Age:0
Cache-Control:max-age=120
Connection:keep-alive
Content-Length:6
Content-Type:text/html; charset=UTF-8
Date:Tue, 12 May 2015 19:35:34 GMT
Expires:Tue, 12 May 2015 19:37:34 GMT
Server:Apache/2.2.15 (CentOS)
Via:1.1 varnish-v4
X-Powered-By:PHP/5.3.3
X-Varnish:32829

我将文件中的文本更改为“test2”,然后转到页面,页面显示“test2”。如果缓存正确,我相信应该显示“test”。

我没有设置 cookies 或任何其他东西,仅此而已。我的 vcl 非常简单:

vcl 4.0;

# Default backend definition. Set this to point to your content server.
backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

sub vcl_recv {
    # Happens before we check if we have this in cache already.
    #
    # Typically you clean up the request here, removing cookies you don't need,
    # rewriting the request, etc.
}

sub vcl_backend_response {
    # Happens after we have read the response headers from the backend.
    #
    # Here you clean the response headers, removing silly Set-Cookie headers
    # and other mistakes your backend does.


    #This will set up "grace mode".
    set beresp.ttl = 10s;
    set beresp.grace = 1h;


}

sub vcl_deliver {
    # Happens when we have all the pieces we need, and are about to send the
    # response to the client.
    #
    # You can do accounting or modifying the final object here.
}

有什么想法吗?谢谢

答案1

很有可能在您的请求中发送了 cookie。Varnish 不会缓存任何带有 cookie 的内容。这来自Varnish 4 的builtin.vcl

47  sub vcl_recv {
48        if (req.method == "PRI") {
49            /* We do not support SPDY or HTTP/2.0 */
50            return (synth(405));
51        }
52        if (req.method != "GET" &&
53          req.method != "HEAD" &&
54          req.method != "PUT" &&
55          req.method != "POST" &&
56          req.method != "TRACE" &&
57          req.method != "OPTIONS" &&
58          req.method != "DELETE") {
59            /* Non-RFC2616 or CONNECT which is weird. */
60            return (pipe);
61        }
62    
63        if (req.method != "GET" && req.method != "HEAD") {
64            /* We only deal with GET and HEAD by default */
65            return (pass);
66        }
67        if (req.http.Authorization || req.http.Cookie) {
68            /* Not cacheable by default */
69            return (pass);
70        }
71        return (hash);
72    }

您需要在 VCL 中删除不需要的 cookie,如下所示此示例来自 Varnish 网站

从后端删除 Set-Cookie(针对特定路径)

在这种情况下,我们会删除预定义路径下对象的 Cookie 标头和 Set-Cookie 标头。这对于图像和类似的静态内容来说很常见。

sub vcl_recv {
    if (req.url ~ "^/images") {
        unset req.http.cookie;
    }
}

sub vcl_backend_response {
    if (req.url ~ "^/images") {
        unset beresp.http.set-cookie;
    }
}

如果您使用 进行测试curl -i URL,则不会发送任何 cookie,并且如果您在一秒多之后重复该操作,您应该会获得大于 0 的 Age 标头。

答案2

我不确定您是否正确设置了宽限模式。清漆书似乎表明您应该设置其中一些,vcl_fetch也许vcl_recv

(我不熟悉 Varnish,但我希望很快就能熟悉)。

核心宽限机制

宽限对象是已过期但仍保留在缓存中的对象 宽限模式是当 Varnish 使用宽限对象时 Varnish 有多种使用宽限对象的方式。 req.grace 定义对象可以过期多长时间以使 Varnish 仍将其视为宽限模式。 beresp.grace 定义 Varnish 将保留对象超过 beresp.ttl 时间多长时间 req.grace 通常会根据后端的状态在 vcl_recv 中修改。当 Varnish 处于宽限模式时,它会使用就 TTL 而言已经过期的对象。发生这种情况的原因有多种,其中之一是后端被健康探测标记为不良。为了使 Varnish 能够使用宽限对象,需要发生两件事:

对象仍需保留。这受 vcl_fetch 中的 beresp.grace 影响。VCL 必须允许 Varnish 使用与保留的对象一样过期的对象。这受 vcl_recv 中的 req.grace 影响。设置宽限时,您需要修改 vcl_recv 和 vcl_fetch 才能有效使用宽限。使用宽限的典型方法是将对象存储超过其 TTL 的几个小时,但仅在 TTL 之后几秒钟使用它,除非后端出现问题。我们稍后将更多地了解健康检查,但现在,以下 VCL 可以说明正常设置:

sub vcl_recv {
        if (req.backend.healthy) {
                set req.grace = 30s;
        } else {
                set req.grace = 24h;
        }
}

sub vcl_fetch {
        set beresp.grace = 24h;
}

答案3

检查 Apache 向 Varnish 发送了哪些标头。您还可以在 Varnish 中明确设置内容的 TTL。

答案4

您可以尝试将 ttl 值增加到 beresp.ttl = 30m;我认为 varnish 的默认 ttl 值为 120 秒。

Age:标题的值是否会在每次点击时增加?

相关内容