清漆可以用作代理来缓存和提供第三方资源吗?

时间:2016-01-28 01:48:04

标签: caching reverse-proxy varnish varnish-vcl

我有一个使用某些第三方脚本和图像的网站,它们是拥有功能齐全的网站的关键。但网站性能受到了冲击,因为这些第三方资源的缓存,压缩和cdn都很差。他们甚至连一个月都没改变。

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

这可以用Varnish做到吗?

1 个答案:

答案 0 :(得分:3)

其他一些注意事项:

  • 您能否处理服务器处理这些资产所带来的额外负担(例如,对于您系统上的一个页面视图,可能会有10-20个资产被提供)?
  • 正在设置哪些Cache-Control标头,是否要为每个资产忽略或覆盖它们
  • 如果从其他域提供资源,则无法保证资源可以正常工作,因为它们可能会假设其相对路径或服务于哪个域。

也就是说,没有技术上的原因你不能为每个人设置一个'后端',然后使用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;
}

您提到内容经常不会发生变化。根据原点是否实际发送了对应于小时或天的标题,您将不需要执行任何操作,否则您将需要覆盖响应中的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;
     }
  }
}

希望这可以让你开始并帮助一点。