1

我们正在使用 Fastly 及其 Varnish 从我们的服务中传递内容。为了在多个服务之间分发内容,我们使用以下代码段:

    sub vcl_recv {
      #FASTLY recv
      if (req.url.path ~ "^/services/") {
        set req.url = regsub(req.url, "/services/(.*?)/", "/");
      }
    }

这有效并允许我们交付/services/user/get到服务的/get端点user

然而,使用这个 Snippet 可以让 Fastly 完全跳过gzip压缩。这可以通过使用来解决return(lookup)

    sub vcl_recv {
      #FASTLY recv
      if (req.url.path ~ "^/services/") {
        set req.url = regsub(req.url, "/services/(.*?)/", "/");
      }
      return (lookup);
    }

此时gzip压缩正在工作。不幸的是,这使得所有POST, PATCH,DELETE请求都以GET.

我尝试研究 Varnish 文档,但不确定是否(lookup)真的是我需要的领域。你能引导我了解这应该如何实施吗?

4

1 回答 1

2

内置VCL

Varnish 使用内置的 VCL 创建一组通用规则。它们充当最终用户的安全网。

有关内置 VCL,请参阅https://github.com/varnishcache/varnish-cache/blob/master/bin/varnishd/builtin.vcl 。

此代码和此文件不应由您加载,而是在您未在其中一个子例程中执行显式返回语句时自动执行。

任何显式的 return 语句都将绕过默认行为。有时这是自定义 Varnish 的行为所必需的。但有时它会适得其反并导致不良行为。

return(lookup)你的陈述的后果

sub vcl_recv {}负责处理传入请求的子例程执行无条件的return(lookup).

这意味着每个请求都会导致缓存查找,即使内置 VCL 宁愿将这些请求直接传递到后端。

有两种策略来决定缓存:

  • 定义可以缓存的规则return(pass)并对所有其他请求执行
  • 定义不能缓存的规则并对return(lookup)所有其他请求执行

基本上这是一个黑名单/白名单之类的东西。

GET & HEAD 与其他请求方法

内置的 VCL 只允许GETHEAD请求被缓存。其他请求方法,例如 a POST,意味着将发生 stat 更改。这就是为什么它们没有被缓存。

如果您尝试执行 areturn(lookup)调用POST,Varnish 会在内部将此请求更改为GET.

有一些方法可以缓存POST调用,但一般来说你不应该这样做。

你应该如何构建你的sub vcl_recv {}

我建议您从子例程中删除该return(lookup)语句。sub vcl_recv {}

如前所述,内置 VCL 将在您退出 custom 后立即接管sub vcl_recv {}

但是,内置的 VCL 不会很有帮助,因为您的网站可能有一些 cookie。

以合理的方式剥离 cookie 并为需要 cookie 的请求保留它们很重要。对于这些页面,return(pass)将插入一个 a 以确保这些个性化请求不会在缓存中查找,而是直接传递给后端。

gzip呢?

可以找出 gzip 停止工作的原因。该varnishlog工具允许您自省正在运行的系统并过滤掉日志。

请参阅https://feryn.eu/blog/varnishlog-measure-varnish-cache-performance/了解我写的关于该主题的大量博客文章。

也许varnishlog可以帮助您找到 gzip 压缩在某些时候停止工作的原因。

于 2020-12-05T16:44:56.153 回答