Varnish 6.6中的更改

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

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

华而不实

立论

  • varnishd 现在支持 -b none 参数只从内置VCL开始,而根本没有后端。

参数

  • 这个 validate_headers 参数已添加到控件 header validation

  • 这个 ban_cutoff 参数现在指的是禁令列表的总长度,包括已完成的禁令,而在此之前,只有未完成(“有效”)的禁令被计入 ban_cutoff

  • 这个 vary_notice 参数,以控制新的 Vary Notice

feature 旗子

  • 这个 busy_stats_rate 添加了功能标记以确保统计信息更新(如使用 thread_stats_rate 参数),即使在工作线程永远不会用完任务并且可能永远忙碌的情况下也是如此。

会计核算

正文字节计数已修复,始终表示在线路上移动的正文字节数,不包括特定于协议的开销,如HTTP/1分块编码或HTTP/2成帧。

此更改会影响计数器,如

  • MAIN.s_req_bodybytes,

  • MAIN.s_resp_bodybytes,

  • VBE.*.*.bereq_bodybytes

  • VBE.*.*.beresp_bodybytes

以及VSL记录

  • ReqAcct

  • PipeAcct

  • BereqAcct

会话关闭原因

已修复连接关闭原因,以正确报告 SC_RESP_CLOSE / resp_close 其中以前仅限 SC_REQ_CLOSE / req_close 据报道。

对于失败的代理连接, SessClose 现在提供了有关故障原因的更详细信息。

改进了HTTP/2连接的会话关闭原因日志记录/统计信息。

更改通知

A日志(VSL) Notice 现在,只要超过 vary_notice 在高速缓存中遇到特定散列的变体。新的 vary_notice 参数默认为10。

对VCL的更改

标题验证

除非新的 validate_headers 功能已禁用,所有新设置的标头现在都经过验证,仅包含RFC7230允许的字符。如果没有,则触发(运行时)VCL故障。

VCL变量

  • 这个 client.identity 变量现在可以在后端访问。

  • 变数 bereq.is_hitpassbereq.is_hitmiss 已添加到后端匹配 req.is_hitpassreq.is_hitmiss 在客户端。

  • 这个 bereq.xid 变量现在还可以在 vcl_pipe {}

  • 这个 resp.proto 变量现在是只读的,因为它应该保持很长时间,就像其他变量一样 *.proto 变量。

VCL的其他更改

  • VCL中的长字符串现在也可以使用 """ ... """ 除了现有的 {" ... "}

  • 这个 ban() 内置现在已弃用,应替换为 std.ban()

  • 试图利用 std.rollback() 从… vcl_pipe 现在会导致VCL故障。

  • 模运算符 % 已添加到VCL。

  • return(retry) 从… vcl_backend_error {} 现在可以正确地重置 beresp.statusberesp.reason

  • 内置的VCL已重新编写:VCL代码已被拆分成多个小的子例程,自定义VCL可以在这些子例程前面添加自定义代码。

    这允许更好地集成自定义VCL和内置VCL并更好地重用。

VMODs

directors.shard()

  • 分片控制器现在支持多个实例的重新配置(添加/移除后端),而不需要任何特殊的排序要求。

  • 给碎片主管打电话 .reconfigure() 方法现在是可选的。如果未显式调用,则在当前任务结束时应用任何碎片控制器后端更改。

  • 碎片导演 Error 使用以下选项记录消息 (notice) 已经变成了 Notice 记录消息。

  • 所有碎片 ErrorNotice 消息现在使用统一前缀 vmod_directors: shard %s

std.set_ip_tos()

这个 set_ip_tos() 函数从捆绑的 std Vmod现在设置在IPv6连接上使用时的IPv6流量类(TCLASS)。

std.ban() and std.ban_error()

这个 std.ban()std.ban_error() 函数已添加到 std Vmod,允许VCL检查BAN错误。新界面的典型使用模式是:

if (std.ban(...)) {
  return(synth(200, "Ban added"));
} else {
  return(synth(400, std.ban_error()));
}

Varnishlog

  • 看见 Accounting 用于更改与会计相关的VSL记录。

  • 看见 Session Close Reasons 对于影响的变化 SessClose

  • 三个新的 Timestamp 已将VSL记录添加到后端请求处理:

    • 这个 Process 之后的时间戳 return(deliver)return(pass(x)) 从… vcl_backend_response

    • 这个 Fetch 请求后端连接之前的时间戳和

    • 这个 Connected 建立到常规后端(VBE)的连接或选择循环使用的连接时的时间戳。

  • 这个 FetchError 日志消息 Timed out reusing backend connection 已重命名为 first byte timeout (reused connection) 以澄清其排放的原因实际上与 first byte timeout

  • ExpKill 日志(VSL)记录现在默认情况下被屏蔽。请参阅 vsl_mask 参数。

  • 改进了VSL查询中的数字比较,以更好地匹配未详细阅读文档的用户可能期望的行为。

  • 看见 Vary Notice 有关新添加的 Notice 记录(VSL)记录。

瓦尼西克萨

  • 这个 %{X}T 格式已添加到 varnishncsa ,这概括了 %D%T ,但也支持毫秒级 (ms )输出。

  • 这个 varnishncsa -E 用于显示ESI请求的参数已更改为隐含 -c (客户端模式)。此行为现在由所有日志实用程序共享,并且 -c 不再包括ESI请求。

瓦尼沙德姆

  • 这个 vcl.discard CLI命令现在可用于通过单个命令丢弃多个VCL,只有当所有给定的VCL都可以被丢弃时才会成功(原子行为)。

  • 这个 vcl.discard CLI命令现在支持VCL名称的全局模式。

  • 这个 vcl.deps 已添加CLI命令以输出VCL之间的依赖关系(由于标签和 return(vcl) 声明)。

  • varnishadm 现在有了 -p 选项以禁用读取行支持,以便在脚本中使用并用作通用CLI连接器。

Varnish状态

  • 看见 Accounting 用于更改与会计相关的计数器。

  • 看见 Session Close Reasons 对于影响的变化 MAIN.sc_* 柜台。

  • 这个 MAIN.esi_req 已添加计数器作为创建的ESI子请求数量的统计信息。

  • 这个 MAIN.s_bgfetch 已添加计数器作为发出的后台获取数的统计信息。

  • varnishstat 现在避免了以前可能下溢到负值的仪表的显示错误,显示为极高的正值。

    这个 -r 选项和 r 添加了键绑定以返回到以前的行为。当中的原始模式处于活动状态时 varnishstat 交互(诅咒)模式,单词 RAW 显示在右手边的下方状态行中。

Varnish测试

已经做出了各种改进 varnishtest 设施:

  • 这个 loop 关键字现在可以在任何地方使用

  • 改进了HTTP/2日志记录

  • 已调整默认的HTTP/2参数

  • 现在,默认情况下,VARNISH侦听地址信息在宏中可用 ${vNAME_addr}${vNAME_port}${vNAME_sock} 。按名称命名的宏 ${vNAME_SOCKET_*} 方法创建的每个侦听套接字的地址信息。 -a 参数为 varnishd

  • 计数器的同步点(VSC)已添加为 varnish vNAME -expect PATTERN OP PATTERN

  • Varnishtest现在还可以与IPv6设置一起使用

  • feature ipv4feature ipv6 可用于控制需要其中一个协议的测试用例的执行。

  • HaProxy参数现在可以通过 HAPROXY_ARGS 变量。

  • LogExpect现在支持使用 expect ? ... 语法和否定匹配 fail add ...fail clear 语法。

  • 整体的logExpect匹配预期现在可以使用 -err 争论。

  • 添加了对HTTP标头的数字比较: -lt-le-eq-ne-ge-gt

  • rxdata -some 已经修好了。

对Varnish实用程序的其他更改

所有使用VUT库实用程序进行参数处理的Varnish工具现在都支持 --optstring 参数返回适合与一起使用的字符串 getopts 来自Shell脚本。

开发人员:VMOD作者的更改

VMOD/VCL接口

  • 这个 VCL_REGEX VMOD现在支持数据类型,允许它们使用由VCL编译器基础结构检查和编译的正则表达式文字。

    因此, VRT_re_init()VRT_re_fini() 函数已被删除,因为它们不是必需的,而且它们的使用可能无论如何都是错误的。

  • 这个 VCL_SUB VMOD现在支持数据类型以保存对子例程的引用,以便稍后使用 VRT_call() 。来自错误上下文的调用(例如,调用子例程访问 req 从后端),并且递归调用使VCL失败。

    看见 VMOD - Varnish Modules 在参考手册中。

VMOD函数还可以返回 VCL_SUB 来自VCL的调用的数据类型,如 call vmod.returning_sub();

  • VRT_check_call() 可用于检查是否存在 VRT_call() 将会成功,以便在不成功的情况下避免潜在的VCL故障。

    它又回来了 NULL 如果 VRT_call() 为什么不会发出调用或错误字符串。

  • VRT_handled() 已添加,现在将使用它而不是访问 handling 成员: VRT_CTX

  • vmodtool.py 已改进,可在多个VMOD构建在单个目录中时简化生成文件。

通用API

  • VRT_ValidHdr() 已为VMOD添加了与 whatsnew_changes_6.6_header_validation 功能,例如,当VMOD使用 cache_http.c 功能如下 http_ForceHeader() 来自不受信任的输入。

  • 客户端和后端有限状态机内部 (enum req_stepenum fetch_step )已从 cache.h

  • 这个 verrno.h 头文件已被删除并合并到 vas.h

  • 这个 pdiff() 函数声明已从 cache.hvas.h

VSA

  • 这个 VSA_getsockname()VSA_getpeername() 添加了获取文件描述符的地址信息的函数。

私有指针

  • VMOD中私有指针的接口已更改:

    • 这个 free 指针位于 struct vmod_priv 已替换为指向 struct vmod_priv_methods ,指向前一个自由回调的指针已作为 fini 成员。

    • 以前的自由回调类型已从 vmod_priv_free_fvmod_priv_fini_f 并获得了一项 VRT_CTX 论辩

  • 这个 VRT_priv_task_get()VRT_priv_top_get() 已向VRT添加函数,以允许vmod检索现有 PRIV_TASK / PRIV_TOP 私有指针,而不创建任何。

后端

  • VRT后端接口已更改:

    • struct vrt_endpoint 添加了用于描述后端要连接到的UDS或TCP端点的。

      端点还支持与每个新连接一起发送前导。

    • 此结构需要通过 endpoint 成员: struct vrt_backend 使用创建后端时 VRT_new_backend()VRT_new_backend_clustered()

  • VRT_Endpoint_Clone() 已添加,以便于使用终结点。

过滤器(VDP/VFP)

  • 许多与筛选器(VDP/VFP)相关的签名已更改:

    • vdp_init_f

    • vdp_fini_f

    • vdp_bytes_f

    • VDP_bytes()

    以及 struct vdp_entrystruct vdp_ctx

    VFP_Push()VDP_Push() 不再用于VMOD,并已从API中删除。

  • VDP代码现在更加严格地 VDP_END ,它最多只能沿过滤器链向下发送一次。发送时应小心 VDP_END 尽可能地与最后的有效载荷字节一起。

装卸工API

  • 已更改stevedore API:

    • OBJ_ITER_FINAL has been renamed to OBJ_ITER_END

    • ObjExtend() 签名已更改,以也涵盖 ObjTrimStore() 使用案例和

    • ObjTrimStore() 已被移除。

开发人员:对Varnish实用程序作者的更改

利布瓦尼沙皮

  • 这个 VSC_IsRaw() 函数已添加到 libvarnishapi 要查询仪表是原始返回还是调整(请参见 varnishstat -r option )。

eof