升级到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_holddown 和 backend_remote_error_holddown 参数。这些定义了在遇到某些类别的错误时新尝试连接到后端的延迟,对于这些错误,立即重新连接尝试可能会适得其反。有关详细信息,请参阅参数文档。
对VCL的更改¶
VCL变量¶
req.ttl
, req.grace
并保持¶
req.grace
以前被移除,但现在被重新引入,因为有一些用例不能没有它就无法解决。同样, req.ttl
曾经被弃用,现在再次得到完全支持。
req.ttl
和 req.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-Match
或 If-Modified-Since
)。如果过期对象也在宽限期内,则 vcl_hit
将不再被调用,因此在这种情况下不可能传递“Keep”对象。
请注意,标头 If-None-Match
和 If-Modified-Since
与304行为一起,由Varnish自动处理。如果出于某种原因,您需要为后端请求显式禁用此功能,则需要通过删除 vcl_backend_fetch
。
中的文档 Grace模式和Keep 已经扩展到更深入地讨论这些问题,请查看那里的更多细节。
beresp.filters
并支持使用VMOD进行后端响应处理¶
这个 beresp.filters
变量是可读和可写的 vcl_backend_response
。这是一个以空格分隔的模块列表,我们称之为VFPS,用于“Varnish Fetch Processor”,它可以在后端响应体被获取时应用到它。在默认Varnish中,该列表可能包括以下值 gzip
, gunzip
,以及 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)
andvarnish-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_econnaborted
,sess_fail_eintr
,sess_fail_emfile
,sess_fail_ebadf
和sess_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_TASK
和PRIV_TOP
参数现在从适当的工作区中获取,而不是像以前那样从堆中获取。对于失败的分配,会触发VCL失败。这一变化的最终结果是,在工作空间短缺的情况下,几乎不可避免的故障将更早发生。所需的工作区大小略有增加,并随每个vmod的数量而扩展
PRIV_TASK
和PRIV_TOP
参数。VCL编译器(VCC)保证,如果使用
PRIV_*
参数,则设置该参数值。API没有任何变化,
PRIV_*
Vmod函数参数提供。VRT_priv_task()
,实现分配的函数PRIV_TASK
和PRIV_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 bystruct vdi_methods
各种回调的签名已更改
VRT_AddDirector()
和VRT_DelDirector()
用于初始化和销毁。vdi_methods
不再从vmod调用回调VRT_Healthy()
将调用替换为healthy
功能管理员健康将不再由vmod操纵
控制器私有状态销毁建议通过
destroy
回拨。
Python3现在是构建版本的首选,在未来的版本中可能会需要它。
我们相信构建现在是可复制的,并打算保持这种方式。
eof