Varnish 7.0中的更改

有关将当前Varnish部署更新到新版本的信息,请参见 升级到Varnish 7.0

有关Varnish更改的更详细的技术说明,以及指向已修复的问题和已合并的拉入请求的链接,请参阅 change log

PCRE2

此版本的一个主要变化是正则表达式引擎从PCRE迁移到PCRE2。这种更改在任何使用正则表达式的地方都应该是透明的,比如VCL、BAN表达式、VSL查询等。

有一些参数更改,请参阅升级说明以了解更多详细信息。

RFC8941-结构化字段

对于VCL编写者来说,HTTP头使用的是可以友好地描述为“异类语法”的东西,这并不奇怪。

2016年,在从斯德哥尔摩的HTTP研讨会返回的火车上,为了回应允许在HTTP头中使用JSON的提议,我开始了一项努力,最终发布了 RFC 8941 Structured Fields

结构化字段中的语法是从当前标准化的标头中提取出来的,这意味着已经涵盖了绝大多数现有的HTTP标头。

有一些不幸的例外,最明显的是Cookie标头。

从这个版本开始,我们逐渐将VCL迁移到结构化字段语义。

第一个变化是现在可以通过使用以下RFC 8941语法在VCL中包括BLOB:

':' + <base64> + ':'

例如,VCL字符串 "helloworld" 可以表示为BLOB文本 :aGVsbG93b3JsZA==: 而不涉及VMOD。

看见 VMOD BLOB-用于VCL BLOB类型、编码和解码的实用程序

第二个也可能是更重要的变化是,VCL中的数字现在也符合RFC8941:最多15位数字和最多3位小数,不再允许使用“科学记数法”。

(这些限制是经过深思熟虑后选择的,以确保不会发生溢出,即使在用IEEE-754 64二进制浮点变量表示数字的语言中处理HTTP头时也是如此。)

华而不实

参数

参数发生了更改:

  • 新的 pcre2_jit_compilation 布尔默认为ON

  • 默认值增加到16KB,用于 vsl_buffer

  • 的默认值增加到96kB workspace_client

  • 的默认值增加到96kB workspace_backend

  • 最小值增加到384B,用于 workspace_session

  • 最小值增加到65535B h2_initial_window_size

  • 的默认值增加到80kB thread_pool_stack

  • 的默认值增加到64KB thread_pool_stack 在32位系统上

  • vcc_acl_pedantic 已删除,请参阅升级说明以了解更多详细信息。

  • pcre_match_limit was renamed to pcre2_match_limit

  • pcre_match_limit_recursion was renamed to pcre2_depth_limit

  • 新的 h2_rxbuf_storage 默认设置为 Transient 有关更多详细信息,请参阅升级说明。

Varnish的其他变化

对于PASS交易, varnishd 不再剥离 Range 来自客户端请求的标头或 Accept-RangeContent-Range 来自后端响应的标头,以允许直接从后端进行部分传递。

什么时候 http_range_support 启用(默认设置)将对后端响应执行一致性检查,格式错误或不一致的响应将被视为提取错误。

为从存储中分配的HTTP/2请求正文提供了新的缓冲区。

有关这两个主题的更多详细信息,请参阅升级说明。

对VCL的更改

VCL变量

一种新的 req.hash_ignore_vary 标志允许在查找过程中跳过Variable标头检查。当只有资源的新鲜度相关,并且在表示上没有细微差异时,这可能很有用。

出于互操作性的目的,现在可以引用不是有效的VCL符号而是有效的HTTP标头名称的标头名称,例如::

req.http."dotted.name"

这很少观察到,只有在更好地与某些客户端或服务器的特定需求集成时才需要。

某些全局VCL符号可以在其声明之前引用,这已扩展到以下关键字的所有全局VCL符号:

  • acl

  • backend

  • probe

  • sub

请考虑以下示例:

sub vcl_recv {
    set req.backend_hint = b;
}

backend b {
    .host = "example.org";
}

它曾经在VCL编译中失败,并显示“符号未找到:‘B’”。 vcl_recv ,并且现在受支持。

位标志

某些VCL关键字有新的位标志语法::

keyword +flag -other ...

类似于位标志 varnishd 参数 debugfeaturevsl_mask 一种 + 前缀表示升起一面旗帜,而一个 - 标志被清除的前缀。

这个 acl Keyword支持以下标志:

  • log

  • pedantic (默认情况下启用)

  • table

例如::

acl <name> +log -pedantic { ... }

看见 访问控制列表(ACL)

这个 include 关键字支持 glob 旗帜。

例如::

include +glob "example.org/*.vcl";

看见 INCLUDE语句

有关更多详细信息,请参阅升级说明。

VMODs

新的 BASE64CF 中的编码方案 vmod_blob 。它类似于 BASE64URL ,对以下内容进行了更改 BASE64

  • + replaced with -

  • / replaced with ~

  • _ 作为填充字符

它被某个CDN提供商使用,他也是这个名字的灵感来源。

请参阅 vmod_blob 人工 (Base64* )。

Varnishlog

如果在流对象上发生缓存命中,则仍在获取的对象, Hit 记录包含获取任务的进度。这应该有助于在缓存命中速度较慢时进行故障排除,无论后端是否仍在为响应提供服务。

看见 VCL

默认情况下 VCL_acl 记录不再发出。可以通过添加一个 +log ACL声明的标志。

看见 访问控制列表(ACL)

瓦尼西克萨

新的 %{...}t 时间格式:

  • sec

  • msec

  • usec

  • msec_frac

  • usec_frac

请参阅 varnishncsa 人工 (FORMAT )了解更多信息。

瓦尼沙德姆

这个 -t 选项设置两个连接到正在运行的 varnishd 实例和发送到该实例的各个命令。

在交互模式下,命令完成应该更准确。

Varnish测试

测试用例通常应该更具反应性,无论是检测 varnishd 启动失败,正在等待 varnishd 停止,或者当测试失败并且存在等待同步的障碍时。

客户端和服务器在请求和响应中最多可以有64个标头。

这个 feature 命令允许优雅地跳过缺少特定需求的测试用例。现在可以根据某个功能的存在跳过测试。

例如,对于以32位环境为目标的测试用例,使用正常的DNS设置:

feature dns !64bit

有新的功能检查:

  • coverage

  • asan

  • msan

  • tsan

  • ubsan

  • sanitizer

  • workspace_emulator

未登记的人 pcre_jit 功能检查已取消。

请参阅职训局手册 (特征 )了解更多详细信息。

有一种新的 tunnel 在两个对等点之间充当代理的命令。隧道可以暂停并控制在每个方向上传输的数据量,并可用于触发套接字超时,可能是在协议帧中间,而不必更改对等设备的实现方式。

请参阅职训局手册 (隧道 )了解更多详细信息。

有一个新的动态宏 ${string,repeat,<uint>,<string>} 避免手工维护时出现过长的队伍或潜在的错误。例如,以下两个字符串是等价的:

"AAA"
"${string,repeat,3,A}"

请参阅职训局手册 (MACROS )了解更多详细信息。

对HTTP/2测试也有各种改进,而且应该会有更多改进。

针对开发人员和VMOD作者的更改

现在,Varnish附带了第二个工作区实现,称为工作区仿真器。它需要在构建过程中使用配置标志来启用 --enable-workspace-emulator

工作区模拟器执行稀疏分配,可以帮助对Fuzing感兴趣的VMOD作者,特别是在启用地址杀毒程序的情况下。

为了使仿真器成为可能,需要对工作区API进行一些调整。不推荐使用的函数 WS_Front()WS_Inside() 是独立于仿真器移除的。

这个 STRING_LIST 类型已不再适用于 STRANDS 。所有与VRT相关的符号 STRING_LIST 不是消失了就是改变了。

方便性常数 vrt_null_strandsvrt_null_blob 都被添加了。

迁移到PCRE2还给VRE API带来了许多变化。VRT功能处理 REGEX 争论没有改变。

对于结构化字段号解析,VNUM API也发生了很大的变化。

不推荐使用的函数 VSB_new()VSB_delete() 都被移除了。

有关详细信息,请参阅升级说明。

eof