Caching varnish可以用作缓存和服务第三方资源的代理吗?

Caching varnish可以用作缓存和服务第三方资源的代理吗?,caching,reverse-proxy,varnish,varnish-vcl,Caching,Reverse Proxy,Varnish,Varnish Vcl,我有一个网站,使用一些第三方脚本和图像,他们是一个完整的功能网站的关键。但是站点性能受到了影响,因为这些第三方资源的缓存、压缩和cdn都很差。他们甚至一个多月都没有变化 我想使用我的varnish实例来缓存这些第三方资源JS、CSS和图像至少几个小时,并通过我的cloudflare从我自己的服务器进行优化 这可以用清漆来做吗 一些额外的注意事项: 您的服务器能否处理服务这些资产可能带来的任何额外负载,例如,对于系统上的一个页面视图,是否会有10-20个资产被服务? 正在设置哪些缓存控制头,是否要

我有一个网站,使用一些第三方脚本和图像,他们是一个完整的功能网站的关键。但是站点性能受到了影响,因为这些第三方资源的缓存、压缩和cdn都很差。他们甚至一个多月都没有变化

我想使用我的varnish实例来缓存这些第三方资源JS、CSS和图像至少几个小时,并通过我的cloudflare从我自己的服务器进行优化


这可以用清漆来做吗

一些额外的注意事项:

您的服务器能否处理服务这些资产可能带来的任何额外负载,例如,对于系统上的一个页面视图,是否会有10-20个资产被服务? 正在设置哪些缓存控制头,是否要忽略或覆盖每个资源的缓存控制头 如果从另一个域提供服务,则无法保证这些资源能够正常工作,因为它们可能会对其相对路径或所服务的域进行假设。 这就是说,没有技术上的理由不能为每一个设置一个“后端”,然后使用URL模式代理它们来检测要为哪一个服务

例如,假设您有一个资源:

您可以设置后端:

backend thirdparty_someparty {
   .host = "someparty.com";
}
然后,您可以以某种形式引用它,如:

<script src="//3p/someparty/assets/js/stuff.js"></script>
您提到,内容经常不会经常更改。根据源站是否实际发送回对应于小时或天的标题,您将不需要执行任何操作,否则您将需要覆盖响应中的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;
     }
  }
}

希望这能让你开始,并对你有所帮助

谢谢你的回答。我刚试过,效果很好!我会添加unset req.http.Cookie;您正在设置HostOverride,这样您就不会给他们您的站点cookie。
sub vcl_backend_response {
  if (bereq.http.Host == "someparty.com") {
     if (! beresp.uncacheable && beresp.ttl < 1h) {
        // Use your judgement here
        set beresp.ttl = 1h;
     }
  }
}