升级到Varnish 5.2

Varnish统计和日志记录

关于统计计数器,在幕后有广泛的变化,但这些变化在用户一级都应该是透明的。

Varnishd参数

这个 vsm_spacecli_buffer 参数现在已弃用并被忽略。它们将在未来的主要版本中删除。

更新后的共享内存实现自动管理空间,因此不再需要 vsm_space 。CLI命令缓冲区的内存现在是动态分配的。

我们已经更新了以下文档 send_timeoutidle_send_timeouttimeout_idleban_cutoff

添加了调试位 vmod_so_keep ,见 调试 以及下面针对开发人员的更改备注。

对VCL的更改

我们增加了一些新的变量,并澄清了一些问题。为Varnish 5.1编写的VCL应在5.2上运行,无需更改。

一致的符号名称

VCL符号来自Varnish的各个部分:有内置的变量、子例程、函数和自由格式的标头。符号可以位于由 '.' (点)字符,如中 req.http.Cache-Control 。创建VCL标签时,将有一个以标签命名的新符号可用。存储后端总是有一个名称,即使您没有指定一个名称,也可以在VCL中访问它们:例如 storage.Transient

因为标头和VCL名称可以包含破折号,而子例程或VMOD对象不能,这造成了不一致。现在所有符号都遵循相同的规则,并且必须遵循相同的(不区分大小写)模式: [a-z][a-z0-9_-]*

您现在可以编写如下代码::

sub my-sub {
    new my-obj = my_vmod.my_constuctor(storage.my-store);
}

sub vcl_init {
    call my-sub;
}

正如您在上面的示例中可能注意到的,还不可能在vmod符号中使用破折号。

过去,由于VSC子系统中的限制,长存储后端名称会被截断,但现在不是这样了。

VCL变量

req.hash and bereq.hash

增列 req.hashbereq.hash ,它包含由Varnish为当前事务中的缓存查找计算的散列值,分别用于客户端或后端上下文。它们的数据类型是BLOB,并且包含原始的二进制散列。

您可以使用 VMOD BLOB-用于VCL BLOB类型、编码和解码的实用程序 要使用散列::

import blob;

sub vcl_backend_fetch {
    # Send the transaction hash to the backend as a hex string
    set bereq.http.Hash = blob.encode(HEX, blob=bereq.hash);
}

sub vcl_deliver {
    # Send the hash in a response header as a base64 string
    set resp.http.Hash = blob.encode(BASE64, blob=req.hash);
}

server.identity

如果 -i 选项未在调用中设置 varnishd ,那么 server.identity 设置为主机名(由返回 gethostname(3) )。此前, server.identity 默认设置为 -n 选项(或默认实例名称,如果 -n 未设置)。看见 华而不实

bereq.is_bgfetch

增列 bereq.is_bgfetch ,它在后端上下文中是可读的,如果提取发生在后台,则为真。也就是说,如果Varnish在缓存中发现其TTL已过期但仍在宽限期内的响应,则为真。Varnish将过时的缓存响应返回给客户端,并启动后台获取以刷新缓存对象。

req.backend_hint

我们已经澄清了会发生什么 req.backend_hint 在客户端重新启动时--它被重置为默认后端。因此,您可能希望确保在这种情况下以您希望的方式设置后端提示。

vmod_std

增列 Bool FILE_EXISTS(字符串路径)

标准分发中的新VMOD

看见 VMOD BLOB-用于VCL BLOB类型、编码和解码的实用程序VMOD清洗-Varnish清洗模块VMOD VTC-用于varnishtest的实用程序模块 。阅读有关它们的信息 标准分发中的新VMOD

禁令

我们已经阐明了当尝试将BAN表达式中的比较与未设置字段进行比较时对BAND的解释,请参见 BAN(字符串) 在……里面 VCL

其他变化

  • varnishd(1)

    • 不再需要显式配置日志和计数器的共享内存空间的总大小,因此 -l 现在被忽略了。

    • 的默认值为 server.identity-i 选项未设置已如上所述更改。

    • 另外, -i 不再决定 ident 使用的字段 syslog(3) ;现在Varnish始终由字符串标识 varnishd 在系统日志中。

    • 在支持以下功能的系统上 setproctitle(3) ,Varnish管理进程将出现在的输出中 ps(1) AS Varnish-Mgt ,子进程为 Varnish-Child 。如果 -i 选项已设置,则ps输出中的这些字符串后面是 -i 和选项设置的标识字符串。

    • 这个 -f VCL源文件的选项现在支持 vcl_path 参数如果使用相对文件名,请参见 华而不实vcl_path

    • 这个 -a 选项现在可以使用名称,例如 -a admin=127.0.0.1:88 以标识用于管理请求但不用于常规客户端流量的地址。否则,将为侦听地址选择默认名称 (a0a1 等等)。终结点名称显示在日志输出中,如下所示,将来可能会在VCL中访问。

  • varnishstat(1)

    • 在curses模式中,显示管理和子进程的正常运行时间的最上面两行显示文本 Not Running 如果两个进程中的一个或两个都关闭。

    • 对多重的解读 -f 命令行中的选项稍有更改,请参见 Varnish状态

    • 这个 typeident 已从XML和JSON输出格式中删除了字段,请参见 Varnish状态

    • 这个 MAIN.s_req 统计数据已删除,因为它与 MAIN.client_req

    • 柜台又加了一句 req_dropped 。类似于 sess_dropped ,这是由于内部队列已满而拒绝HTTP/2流的次数。看见 Varnish计数器thread_queue_limit

  • varnishlog(1)

    • 这个 HitHitMissHitPass 日志记录使用查找时对象的剩余TTL增加了一个附加字段。虽然这应该会极大地帮助故障排除,但它可能会破坏依赖这些记录的工具,以获得在查找期间命中的对象的VXID。

      与其使用 Hit ,这样的工具现在应该使用 Hit[1] ,这同样适用于 HitMissHitPass

      这个 Hit Record还为宽限期和保持期间增加了两个字段。这对于故障排除应该也很有用。

      看见 VSL

    • 这个 SessOpen 日志记录在其第3个字段中显示侦听地址的名称,而不是端点。

      看见 VSL

    • 的输出格式 VCL_trace 日志记录,如果您打开 VCL_trace VSL掩码中的标志已更改为包括VCL配置名称。看见 VSLvsl_mask

  • varnishtest(1)vtc(7)

    • 使用调用varnishtest时 -L-l ,由测试启动的Varnish实例在停止时不会清理其VMOD共享对象的副本。请参阅有关的说明 vmod_so_keep 下面。

    • 添加了功能开关 ignore_unknown_macro 有关测试用例,请参见 VTC

  • varnishncsa(1)

    • 字段说明符(如1 in Hit[1] )现在被限制为255个,请参见 瓦尼西克萨

  • 这个 -N 命令行选项,该选项以前可用于 varnishlog(1)varnishstat(1)varnishncsa(1)varnishhist(1) 与更改后的内部日志记录API不兼容,并且已停用。

  • 针对开发人员的更改:

    • 用于共享内存和统计信息的VSM和VSC API已更改,可能需要在客户端应用程序中进行更改,请参见 VSM/VSC API更改

    • 添加了 $ABI 有关VMOD VCC声明的指令,请参见 $ABI [strict|vrt]

    • VRT API中有一些细微的变化,可用于VMOD和客户端应用程序,请参阅 VRT API更改

    • VUT API(用于Varnish实用程序)促进了客户端应用程序的开发,现已公开提供,请参阅 添加了VUT API

    • 调试位 vmod_so_keep 指示Varnish停止时不要清理其VMOD共享对象的副本。这使得VMOD作者可以在varnishd崩溃后将其代码加载到调试器中。看见 调试

eof