首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将特定URL路径缓存在Varnish中将失败

将特定URL路径缓存在Varnish中将失败
EN

Stack Overflow用户
提问于 2022-08-11 19:14:41
回答 1查看 47关注 0票数 0

我已经设置了一些VCL,只缓存/js/文件夹。

代码语言:javascript
复制
sub vcl_backend_response {
   if (bereq.url ~ "^/js/.$") {
       unset beresp.http.set-cookie;
       set beresp.http.cache-control = "max-age = 2592000";
       set beresp.ttl = 1y;
   }else {
       set beresp.http.cache-control = "max-age = 0";
       set beresp.ttl = 0s;
   }
}

在重新加载几次之后,当我检查js文件夹中项的缓存状态时,没有缓存任何内容,缓存控制头显示0。

代码语言:javascript
复制
# curl -I localhost:6081/js/themes.js
HTTP/1.1 200 OK
Content-Type: application/javascript
Etag: W/"1655132873"
Last-Modified: Mon, 13 Jun 2022 15:07:53 GMT
Accept-Ranges: bytes
X-Content-Type-Options: nosniff
Content-Length: 656
Date: Thu, 11 Aug 2022 19:13:50 GMT
cache-control: max-age = 0
Vary: Accept-Encoding
X-Varnish: 5
Age: 0
Via: 1.1 varnish (Varnish/6.5)
Connection: keep-alive

知道怎么解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-12 03:22:47

在缓存中存储对象之前调用vcl_backend_response子例程。您提供的VCL逻辑至少将确保Javascript在缓存中结束。

但是,我不太确定您的^/js/.$"正则表达式是否匹配正确的URL。也许^/js/.*$会是一个更好的匹配。

用于vcl_backend_response的内置VCL

还可能有其他因素阻止将对象存储在te缓存中。如果您查看以下有关Varnish内置VCL的教程,您将看到应用了什么逻辑:https://www.varnish-software.com/developers/tutorials/varnish-builtin-vcl/#11-vcl_backend_response

如果响应包含一个Cache-Control: no-cache、一个Cache-Control: no-store或一个Cache-Control: private头,Varnish仍然不会将对象存储在缓存中。

为了防止这种情况发生,您实际上可以调用return(deliver)。这将绕过任何其他内置的VCL逻辑。

下面是您的VCL代码的样子:

代码语言:javascript
复制
sub vcl_backend_response {
   if (bereq.url ~ "^/js/.*$") {
       unset beresp.http.set-cookie;
       set beresp.http.cache-control = "max-age = 2592000";
       set beresp.ttl = 1y;
       return(deliver);
   }else {
       set beresp.http.cache-control = "max-age = 0";
       set beresp.ttl = 120s;
       set beresp.uncacheable = true;
       return(deliver);
   }
}

然而,内置的VCL逻辑基本上是有意义的,所以我在绕过它时会非常谨慎。

您可能注意到,我从VCL示例中删除了set beresp.ttl=0,并将其替换为set beresp.uncacheable=true。那是因为你不应该把TTL设置为零。由于与此问题无关的原因,它们将使Varnish的性能非常差,并将导致后端获取的增加。

用于vcl_recv的内置VCL

虽然我们讨论了如何通过vcl_backend_response逻辑强制对象存储在缓存中,但这并不意味着对象将从缓存中得到服务。这就是vcl_recv内置的VCL发挥作用的地方。

有关vcl_recv内置VCL的教程,请参阅vcl_recv

如果一个请求包含一个CookieAuthorization头,尽管它是静态的内容,但尽管它是静态的内容,但它不会从缓存中为对象提供服务。

要绕过此行为,还可以添加以下代码:

代码语言:javascript
复制
sub vcl_recv {
    if (req.url ~ "^/js/.*$") {
        unset req.http.Cookie;
        unset req.http.Authorization;
        return(hash);
    }
}

这将确保/js/文件夹中的所有内容都将从缓存中得到服务。

用于缓存静态数据的VCL模板

如果您的目标是缓存静态数据,而不管它存储在哪个文件夹中,则可以使用以下VCL模板:

代码语言:javascript
复制
sub vcl_recv {
    if (req.url ~ "^[^?]*\.(7z|avi|bmp|bz2|css|csv|doc|docx|eot|flac|flv|gif|gz|ico|jpeg|jpg|js|less|mka|mkv|mov|mp3|mp4|mpeg|mpg|odt|ogg|ogm|opus|otf|pdf|png|ppt|pptx|rar|rtf|svg|svgz|swf|tar|tbz|tgz|ttf|txt|txz|wav|webm|webp|woff|woff2|xls|xlsx|xml|xz|zip)(\?.*)?$") {
        unset req.http.Cookie;
        unset req.http.Authorization
        return(hash);
    }
}

sub vcl_backend_response {
    if (bereq.url ~ "^[^?]*\.(7z|avi|bmp|bz2|css|csv|doc|docx|eot|flac|flv|gif|gz|ico|jpeg|jpg|js|less|mka|mkv|mov|mp3|mp4|mpeg|mpg|odt|ogg|ogm|opus|otf|pdf|png|ppt|pptx|rar|rtf|svg|svgz|swf|tar|tbz|tgz|ttf|txt|txz|wav|webm|webp|woff|woff2|xls|xlsx|xml|xz|zip)(\?.*)?$") {
        unset beresp.http.Set-Cookie;
        set beresp.ttl = 1d;
    }
}

它来自以下教程:https://www.varnish-software.com/developers/tutorials/example-vcl-template/#13-caching-static-content

您仍然可以通过增加TTL或在regex中对特定文件夹进行前缀来调整它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73325833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档