varnish可以作为代理来缓存和服务第三方资源吗?
Can varnish be used as a proxy to cache and serve third party resources?
我的网站使用了一些第三方脚本和图像,它们是拥有功能齐全的网站的关键。但是网站性能受到了打击,因为这些第三方资源的缓存、压缩和 cdn 都很差。他们甚至一个多月都没有改变。
我想使用我的 varnish 实例来缓存这些第三方资源以及 JS、CSS 和图像至少几个小时,并通过我的 cloudflare 优化从我自己的服务器提供服务。
这可以用 Varnish 来做吗?
一些额外的注意事项:
- 您的服务器能否处理因提供这些资产而产生的任何额外负载(例如,对于您系统上的一个页面视图,可能会提供 10-20 个资产)?
- 正在设置什么 Cache-Control headers,您想为每个资产忽略还是覆盖它们
- 如果从另一个域提供资源,则无法保证这些资源会正常工作,因为它们可能会假设它们的相对路径或它们在哪个域上提供服务。
也就是说,没有技术原因您不能为每个设置一个 'backend',然后使用 URL 模式代理它们以检测要服务哪个。
例如,假设您有一个资源:
http://someparty.com/assets/js/stuff.js
您可以设置后端:
backend thirdparty_someparty {
.host = "someparty.com";
}
然后您可能会以某种形式引用它,例如:
<script src="//3p/someparty/assets/js/stuff.js"></script>
然后在你的 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;
}
您提到内容经常不经常更改。根据源是否实际上发回 headers 相应的小时或天,那么您不需要做任何事情,否则您将需要覆盖响应中的 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;
}
}
}
希望这能让您入门并有所帮助。
我的网站使用了一些第三方脚本和图像,它们是拥有功能齐全的网站的关键。但是网站性能受到了打击,因为这些第三方资源的缓存、压缩和 cdn 都很差。他们甚至一个多月都没有改变。
我想使用我的 varnish 实例来缓存这些第三方资源以及 JS、CSS 和图像至少几个小时,并通过我的 cloudflare 优化从我自己的服务器提供服务。
这可以用 Varnish 来做吗?
一些额外的注意事项:
- 您的服务器能否处理因提供这些资产而产生的任何额外负载(例如,对于您系统上的一个页面视图,可能会提供 10-20 个资产)?
- 正在设置什么 Cache-Control headers,您想为每个资产忽略还是覆盖它们
- 如果从另一个域提供资源,则无法保证这些资源会正常工作,因为它们可能会假设它们的相对路径或它们在哪个域上提供服务。
也就是说,没有技术原因您不能为每个设置一个 'backend',然后使用 URL 模式代理它们以检测要服务哪个。
例如,假设您有一个资源: http://someparty.com/assets/js/stuff.js
您可以设置后端:
backend thirdparty_someparty {
.host = "someparty.com";
}
然后您可能会以某种形式引用它,例如:
<script src="//3p/someparty/assets/js/stuff.js"></script>
然后在你的 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;
}
您提到内容经常不经常更改。根据源是否实际上发回 headers 相应的小时或天,那么您不需要做任何事情,否则您将需要覆盖响应中的 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;
}
}
}
希望这能让您入门并有所帮助。