我已经设置了一些VCL,只缓存/js/文件夹。
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。
# 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知道怎么解决这个问题吗?
发布于 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代码的样子:
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。
如果一个请求包含一个Cookie或Authorization头,尽管它是静态的内容,但尽管它是静态的内容,但它不会从缓存中为对象提供服务。
要绕过此行为,还可以添加以下代码:
sub vcl_recv {
if (req.url ~ "^/js/.*$") {
unset req.http.Cookie;
unset req.http.Authorization;
return(hash);
}
}这将确保/js/文件夹中的所有内容都将从缓存中得到服务。
用于缓存静态数据的VCL模板
如果您的目标是缓存静态数据,而不管它存储在哪个文件夹中,则可以使用以下VCL模板:
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;
}
}您仍然可以通过增加TTL或在regex中对特定文件夹进行前缀来调整它。
https://stackoverflow.com/questions/73325833
复制相似问题