Man*_*Pat 2 caching reverse-proxy varnish varnish-vcl
我有一个使用一些第三方脚本和图像的网站,它们是拥有功能齐全的网站的关键。但由于这些第三方资源的缓存、压缩和 CDN 性能较差,网站性能受到了影响。而且他们甚至一个多月都没有改变。
我想使用我的 Varnish 实例来缓存这些第三方资源(JS、CSS 和图像)至少几个小时,并通过我的 cloudflare 进行优化,从我自己的服务器提供服务。
用清漆可以做到这一点吗?
一些额外的考虑因素:
也就是说,没有任何技术原因您无法为每个后端设置一个“后端”,然后使用 URL 模式代理它们来检测要提供服务的后端。
例如,假设您有一个资源: http: //someparty.com/assets/js/stuff.js
您可以设置一个后端:
backend thirdparty_someparty {
.host = "someparty.com";
}
Run Code Online (Sandbox Code Playgroud)
然后您可以以某种形式引用它,例如:
<script src="//3p/someparty/assets/js/stuff.js"></script>
Run Code Online (Sandbox Code Playgroud)
然后在你的VCL中:
sub vcl_recv {
if (req.url ~ "^/3p/someparty") {
set req.backend_hint = thirdparty_someparty;
set req.url = regsub(req.url, "^/3p/someparty", "");
// This way we don't override the Host for logging
set req.http.HostOverride = "someparty.com";
}
}
sub vcl_backend_fetch {
if (bereq.http.HostOverride) {
set bereq.http.Host = bereq.http.HostOverride;
}
unset bereq.http.HostOverride;
}
Run Code Online (Sandbox Code Playgroud)
您提到内容经常不会经常改变。根据源是否实际发送回对应于小时或天的标头,您无需执行任何操作,否则您将需要覆盖响应中的 TTL。
sub vcl_backend_response {
if (bereq.http.Host == "someparty.com") {
if (! beresp.uncacheable && beresp.ttl < 1h) {
// Use your judgement here
set beresp.ttl = 1h;
}
}
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助您入门并有所帮助。