升级到Varnish 6.1

Varnish 6.0.x的配置将在6.1版上运行,无需更改。对VCL变量的解释有了细微的变化 beresp.keep 在特定情况下,如下所述。除此之外,6.1中的更改是新功能,如下所述。

Varnishd参数

我们已经添加了 max_vcl 参数来设置加载的VCL程序数量的阈值,因为让以前的VCL实例累积而不丢弃它们是一种常见的错误。未丢弃的VCL的剩余部分在管理进程的工作目录中以文件的形式存在。随着时间的推移,其中太多可能会占用大量存储空间,以及管理操作,如 vcl.list 当Varnish不得不迭代许多文件时,可能会变得非常慢,甚至超时。

中的默认阈值 max_vcl 为100,且VCL标签不计入总数。这个 max_vcl_handling 参数控制达到限制时发生的情况。默认情况下,您只收到来自VCL编译器的警告,但您可以将其设置为拒绝加载更多VCL,或忽略该阈值。

添加了 backend_local_error_holddownbackend_remote_error_holddown 参数。这些定义了在遇到某些类别的错误时新尝试连接到后端的延迟,对于这些错误,立即重新连接尝试可能会适得其反。有关详细信息,请参阅参数文档。

对VCL的更改

VCL变量

req.ttlreq.grace 并保持

req.grace 以前被移除,但现在被重新引入,因为有一些用例不能没有它就无法解决。同样, req.ttl 曾经被弃用,现在再次得到完全支持。

req.ttlreq.grace 限制当前请求允许的ttl和宽限时间。如果 req.ttl ,则仅当缓存对象的剩余ttl小于或等于时,缓存对象才被视为新的(并且可能是缓存命中 req.ttl 。同样, req.grace 设置对象在宽限中花费的时间上限,以被认为有资格进入宽限模式(即交付该对象并在后台获取新的副本)。

一种常见的应用是在后端已知健康时设置较短的TTL,以便在一切正常时响应更新鲜。但如果后端不健康,则使用具有较长TTL的缓存响应来减轻出现问题的后端的负载::

sub vcl_recv {
      # ...
      if (std.healthy(req.backend_hint)) {
              # Get responses no older than 70s for healthy backends
              set req.ttl = 60s;
              set req.grace = 10s;
      }

      # If the backend is unhealthy, then permit cached responses
      # that are older than 70s.
}

对中国的评价 beresp.keep 计时器有一点变化。 keep 除了对象的TTL之外,还设置缓存中的生存期,这些对象可以通过后端对条件请求(WITH)的304“未修改”响应进行验证 If-None-MatchIf-Modified-Since )。如果过期对象也在宽限期内,则 vcl_hit 将不再被调用,因此在这种情况下不可能传递“Keep”对象。

请注意,标头 If-None-MatchIf-Modified-Since 与304行为一起,由Varnish自动处理。如果出于某种原因,您需要为后端请求显式禁用此功能,则需要通过删除 vcl_backend_fetch

中的文档 Grace模式和Keep 已经扩展到更深入地讨论这些问题,请查看那里的更多细节。

beresp.filters 并支持使用VMOD进行后端响应处理

这个 beresp.filters 变量是可读和可写的 vcl_backend_response 。这是一个以空格分隔的模块列表,我们称之为VFPS,用于“Varnish Fetch Processor”,它可以在后端响应体被获取时应用到它。在默认Varnish中,该列表可能包括以下值 gzipgunzip ,以及 esi ,取决于您如何设置 beresp.do_* 变量。

此添加使VMOD可以定义VFP来筛选或操作后端响应正文,可以通过更改中的列表来添加 beresp.filters 。VFP按中给出的顺序应用 beresp.filters ,并且您可能必须确保VFP在列表中的位置正确,例如,如果它只能应用于未压缩的响应正文。

这是一项新功能,在发布时,我们只知道在VMOD中实现了测试VFP。随着时间的推移,我们希望VFP代码的“生态”会发展起来,丰富Varnish部署可用的功能。

obj.hits

中返回正确的值。 vcl_hit (一直是0年。 vcl_hit )。

VCL的其他更改

  • 这个 Host 客户端请求中的标头对于HTTP/1.1是必需的,这是HTTP标准所禁止的。如果它不见了,那么 builtin.vcl 导致返回合成400“错误请求”响应。

  • 现在可以向提供字符串参数 return(fail("Foo!")) ,它可用于 vcl_init 如果由于返回而导致VCL加载失败,则发出错误消息。

  • 其他内容 import 现在将忽略已导入的vmod的语句。

VMODs

添加了 Bool fnMatch(字符串模式,字符串主题,BOOL路径名,BOOL无转义,BOOL句点) 函数用于 VMOD标准-Varnish标准模块 ,您可以使用它进行Shell样式的通配符匹配。通配符模式可能非常适合匹配URL,以便与如下模式进行匹配 /foo/*/bar/* 。如果需要的话,可以在运行时构建模式,因为它们不需要在VCL加载时执行正则表达式所需的预编译步骤。如果您只是更习惯使用通配符语法,而不是使用正则表达式,那么现在您可以选择。

VMOD Unix-Unix域套接字实用程序 现在支持SunOS及其后代。这需要在加载VMOD时更改子进程的权限集,请参阅文档。

其他变化

  • varnishd(1)

    • 一些VCL编译时错误消息已得到改进,例如,当找不到符号或缺少VMOD调用的参数时。

    • Varnish现在不会重写 Content-Length 在响应任何HEAD请求时缓存HEAD请求的头部,从而可以独立于GET响应来缓存HEAD请求的响应(以前,HEAD请求必须是PASS才能避免这种重写)。

    • 如果您已设置 .proxy_header=1 (使用PROXYv1协议)作为Unix域套接字寻址的后端(使用 .path 套接字文件的设置),并且还定义了一个用于后端的探测器,然后是地址族 UNKNOWN 在探测请求的代理头中发送。如果您已设置 .proxy_header=2 (对于PROXYv2)对于带有探测器的UDS后端,则 PROXY LOCAL 为探测请求发送。

  • varnishlog(1)vsl(7)

    • 的内容 FetchError 日志条目已得到改进,可以为某些类别的后端获取故障提供更好的人类可读诊断。

      特别是,除了先前的数值之外,现在还以符号形式报告http连接(HTC)错误。

    • 新项下的日志条目 SessError 标记现在提供了有关会话接受失败(接受客户端连接失败)更多诊断信息。这些必须在原始分组中查看,因为接受失败不是任何请求/响应事务的一部分。

    • 当后端不健康时, Backend_health 现在除了报告HTTP响应和计时信息外,还报告一些诊断信息。

    • 记录的后端名称 Backend_health 只是不带VCL前缀的后端名称(与后端命名不同)。

    • 添加了日志条目标签 Filters ,它给出了应用于响应正文的过滤器的列表(请参见 beresp.filters 如上所述)。

  • varnishadm(1) and varnish-cli(7)

    • 对于许多CLI命令,现在可以使用 -j 参数来获取JSON响应,这可能有助于实现自动化。这些措施包括:

      • ping -j

      • backend.list -j

      • help -j

      CLI中的JSON响应始终包括时间戳(以秒为单位的纪元时间,精度为毫秒),指示生成响应的时间。

    • 这个 backend.list Command现在列出了控制器和后端,以及它们的健康状态。该命令现在有一个 -v 详细输出选项,其中显示每个后端/控制器的详细运行状况。

  • varnishstat(1)varnish-counters(7)

    • 我们已经将一些计数器添加到 VBE.* 帮助更好地诊断后端错误情况的小组:

      • VBE.*.unhealthy :由于后端运行不正常而未尝试的提取数

      • .busy :未尝试的提取数,因为 .max_connections 已达到限制

      • .fail :尝试打开后端连接失败的次数。失败的详细原因请参阅 .fail_* 计数器(在DIAG级别显示)和日志条目 FetchError.fail 中的值之和。 .fail_* 柜台。

      • .fail_eaccess.fail_eaddrnotavail.fail_econnrefused.fail_enetunreach.fail_etimedout :这些是尝试连接到后端失败的次数,给定值为 errno(3)

      • .fail_other :由于其他原因以外的原因失败的后端连接数 .fail_* 柜台。对于这种情况,可以从Varnish日志中提取故障的详细信息,如上所述 FetchError

      • .helddown: the number of connections not attempted because the backend was in the period set by one of the parameters backend_local_error_holddown or backend_remote_error_holddown

    • 类似地,我们添加了一系列计数器,以便更好地诊断会话接受故障(无法接受来自客户端的连接)。和以前一样, sess_fail 计数器给出了接受失败的总数,现在增加了 sess_fail_* 柜台。 sess_fail 中的值的总和 sess_fail_*

      • sess_fail_econnabortedsess_fail_eintrsess_fail_emfilesess_fail_ebadfsess_fail_enomem :指示的值为的接受失败次数 errno(3) 。这个 Varnish计数器 手册页,以及 varnishstat ,给出每一种可能发生的原因,以及可以采取什么措施来应对该问题。

      • sess_fail_other :由于其他原因以外的原因而导致接受失败的次数 sess_fail_* 柜台。有关更多详细信息,请参阅 SessError 录入日志 (Varnish计数器 显示了一个 varnishlog 可能有帮助的调用)。

    • 在Curses模式中,标题行中的信息(正常运行时间和缓存命中率)总是被报告,即使您定义了一个过滤器将它们排除在统计表之外。

    • 禁赛统计数据现在报告得更准确了(由于比赛条件的原因,他们受到了不一致的影响)。

  • varnishtest(1)vtc(7)

    • varnishtest 以及 vtc 测试脚本语言现在支持对haproxy和Varnish的测试。这个 haproxy 指令可用于定义、配置、启动和停止haProxy实例,还可以编写消息脚本以在haProxy CLI连接上发送,并定义对响应的期望。请参阅 haproxy 中的部分 VTC 了解更多细节。

    • 与haProxy支持相关,您现在可以定义一个 syslog 实例在测试脚本中。这定义了一个系统日志服务器,并允许您测试对来自haProxy实例的系统日志输出的期望。

    • 添加了 -keepalive 与一起使用的客户端和服务器脚本的参数 -repeat 指令,该指令使所有测试迭代在同一连接上运行,而不是每次打开一个新连接。这使得测试运行得更快,并且使用更少的临时端口。

    • 添加了 -need-bytes 的论据 process 命令,请参见 VTC

  • varnishhist(1)

    • 这个 -P min:max 命令行参数现在是可选的,请参见 Varnish艺人

  • 对于访问Varnish日志的所有实用程序-- varnishlog(1)varnishncsa(1)varnishtop(1)varnishhist(1) --已经可以设置多个 -I-X 命令行参数。现在,您可以使用多个包含和排除筛选器,将正则表达式应用于选定的日志记录,这一点已经得到了正确的说明。

  • 针对开发人员的更改:

    • 如上所述,VMOD现在可以实现可通过更改添加到后端响应处理的VFP beresp.filters 。VFPS的接口在中定义 cache_filters.h ,并且发行版中包含的调试VMOD显示了用于ROT13的VFP的示例。

    • Varnish API soname版本(针对libvarnishapi.so)已升级到2.0.0。

    • VRT版本已经升级到8.0。看见 vrt.h 有关7.0版以来的更改的详细信息。

    • Varnish维护所需的空间 PRIV_TASKPRIV_TOP 参数现在从适当的工作区中获取,而不是像以前那样从堆中获取。对于失败的分配,会触发VCL失败。

      这一变化的最终结果是,在工作空间短缺的情况下,几乎不可避免的故障将更早发生。所需的工作区大小略有增加,并随每个vmod的数量而扩展 PRIV_TASKPRIV_TOP 参数。

      VCL编译器(VCC)保证,如果使用 PRIV_* 参数,则设置该参数值。

      API没有任何变化, PRIV_* Vmod函数参数提供。

    • VRT_priv_task() ,实现分配的函数 PRIV_TASKPRIV_TOP 参数,现在更有可能返回 NULL 由于同样的原因导致分配失败。

      请注意,在VMOD中显式使用此函数被认为是实验性的,因为此接口可能会更改。

    • 我们已经改进了对 STRANDS 数据类型,您可能会发现它比基于varargs的 STRING_LIST 。看见 vrt.h 了解更多细节。 VMOD BLOB-用于VCL BLOB类型、编码和解码的实用程序 已被重构以使用 STRANDS ,所以你可以在那里寻找一个例子。

    • 我们修复了一个错误,该错误限制了 INT 数据类型,因此您现在可以获得完整的64位。

    • 之前声明的部分内容 cache_director.h 已经搬到了 vrt.h ,构成了面向董事的公开API。中的其余部分 cache_director.h 不是公共的,不应由旨在与VRT ABI兼容的VMOD使用。

    • 中的Director API vrt.h 与以前的界面不同。 写一部导演 已相应更新。简而言之,最重要的变化包括:

      • struct director_methods is replaced by struct vdi_methods

      • 各种回调的签名已更改

      • VRT_AddDirector()VRT_DelDirector() 用于初始化和销毁。

      • vdi_methods 不再从vmod调用回调

      • VRT_Healthy() 将调用替换为 healthy 功能

      • 管理员健康将不再由vmod操纵

      • 控制器私有状态销毁建议通过 destroy 回拨。

    • Python3现在是构建版本的首选,在未来的版本中可能会需要它。

    • 我们相信构建现在是可复制的,并打算保持这种方式。

eof