升级到Varnish 5.2¶
Varnish统计和日志记录¶
关于统计计数器,在幕后有广泛的变化,但这些变化在用户一级都应该是透明的。
Varnishd参数¶
这个 vsm_space
和 cli_buffer
参数现在已弃用并被忽略。它们将在未来的主要版本中删除。
更新后的共享内存实现自动管理空间,因此不再需要 vsm_space
。CLI命令缓冲区的内存现在是动态分配的。
我们已经更新了以下文档 send_timeout , idle_send_timeout , timeout_idle 和 ban_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.hash
和 bereq.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¶
标准分发中的新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)
ASVarnish-Mgt
,子进程为Varnish-Child
。如果-i
选项已设置,则ps输出中的这些字符串后面是-i
和选项设置的标识字符串。这个
-f
VCL源文件的选项现在支持vcl_path
参数如果使用相对文件名,请参见 华而不实 和 vcl_path 。这个
-a
选项现在可以使用名称,例如-a admin=127.0.0.1:88
以标识用于管理请求但不用于常规客户端流量的地址。否则,将为侦听地址选择默认名称 (a0
,a1
等等)。终结点名称显示在日志输出中,如下所示,将来可能会在VCL中访问。
varnishstat(1)
:在curses模式中,显示管理和子进程的正常运行时间的最上面两行显示文本
Not Running
如果两个进程中的一个或两个都关闭。对多重的解读
-f
命令行中的选项稍有更改,请参见 Varnish状态 。这个
type
和ident
已从XML和JSON输出格式中删除了字段,请参见 Varnish状态 。这个
MAIN.s_req
统计数据已删除,因为它与MAIN.client_req
。柜台又加了一句
req_dropped
。类似于sess_dropped
,这是由于内部队列已满而拒绝HTTP/2流的次数。看见 Varnish计数器 和 thread_queue_limit 。
varnishlog(1)
:这个
Hit
,HitMiss
和HitPass
日志记录使用查找时对象的剩余TTL增加了一个附加字段。虽然这应该会极大地帮助故障排除,但它可能会破坏依赖这些记录的工具,以获得在查找期间命中的对象的VXID。与其使用
Hit
,这样的工具现在应该使用Hit[1]
,这同样适用于HitMiss
和HitPass
。这个
Hit
Record还为宽限期和保持期间增加了两个字段。这对于故障排除应该也很有用。看见 VSL 。
这个
SessOpen
日志记录在其第3个字段中显示侦听地址的名称,而不是端点。看见 VSL 。
的输出格式
VCL_trace
日志记录,如果您打开VCL_trace
VSL掩码中的标志已更改为包括VCL配置名称。看见 VSL 和 vsl_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