升级到Varnish 5.1¶
Varnishd命令行选项¶
如果您必须更改5.1版的任何内容,那么最有可能的是 varnishd 在您的启动脚本中,因为我们对可以一起使用的选项有更严格的限制。这主要是为了澄清用于测试目的的选项的用法,例如使用 varnishd -C
检查VCL源代码的语法正确性。我们还增加了一些新的选项。
详细信息请参见 华而不实 ,但以下是摘要:
增列
-I clifile
在启动时在辅助进程启动之前运行CLI命令。看见 启动CLI命令文件 。不止一个
-f
现在允许在启动时预加载VCL实例的选项。其中最后一个成为在启动时处于活动状态的“引导”实例。要么
-b
或一个或多个-f
必须指定选项,但不能同时指定两个选项,并且不能同时省略它们,除非-d
用于启动 varnishd 在调试模式下。如果空字符串指定为唯一-f
选项,然后 varnishd 在不启动工作进程的情况下启动,管理进程将接受CLI命令。增列
-?
以打印用法消息,该消息仅针对此选项打印。添加了
-x
可选择打印某些类型的文档并退出。什么时候-x
必须是唯一的选择。只有一位
-F
或-d
可以使用,但这两种方法都不能与-C
。添加了
workuser
参数设置为-j
选择。
Varnishd参数¶
共享内存日志的大小现在限制为4G-1b(4294967295字节)。这将上限设置为
-l
命令行选项和vsl_space
和vsm_space
参数。增列
clock_step
,thread_pool_reserve
和ban_cutoff
(见 clock_step , thread_pool_reserve , ban_cutoff )。thread_pool_stack
不再被认为是试验性的,并且有更广泛的文档记录,请参见 thread_pool_stack 。thread_queue_limit
仅适用于排队的客户端请求,请参见 thread_queue_limit 。vcl_dir
和vmod_dir
已弃用,并将从未来版本中删除,请使用vcl_path
和vmod_path
相反(请参见 vcl_path , vmod_path )。所有参数都在每个平台上定义,包括那些不能在每个平台上运行的参数。其中大多数涉及到TCP堆栈的功能,例如
tcp_keepalive_intvl
,tcp_keepalive_probes
,accept_filter
和tcp_fastopen
。参数的输出中记录了参数不可用param.show
指挥部。设置这样的参数不是错误,但没有任何效果。
对VCL的更改¶
为Varnish 5.0编写的VCL很可能在5.1版中无需更改即可运行。我们向该语言添加了一些新的元素和功能(您可能希望开始使用它们),澄清了一些问题,并弃用了一些很少使用的语言元素。
类型转换¶
我们花了一些心思来解释 +
和 -
用于具有不同数据类型的各种操作数组合的运算符,其中许多算作角例(例如,从IP地址减去一个字符串是什么意思?)。回想一下 +
表示数字操作数的加法,以及字符串操作数的字符串连接;如果需要字符串并且没有合理的数字解释,则可以将操作数转换为字符串并连接。
语义几乎在所有情况下都没有改变,但非法操作数组合的错误消息有所改善。最重要的是,我们花了时间审查这些案例,因此这将是VCL未来的工作方式。
总而言之:
如果的两个操作数
+
或-
为字节、持续时间、int或实数之一,则结果具有相同的数据类型,具有明显的数字解释。如果在需要字符串的上下文中计算这样的表达式(例如,为标题赋值),则首先执行算术运算,并将结果转换为字符串。整数和实数可以相加或相减,以得到实数。
可以将持续时间加到时间上或从时间中减去,以得到时间。
任何其他操作数类型组合都不能与
-
。当一个
+
表达式在字符串上下文中求值,然后对于操作数数据类型的所有其他组合,将操作数转换为字符串并串联。如果不需要字符串作为
+
表达式,则其他任何数据类型组合都不合法。
有关数据类型的其他说明:
什么时候
bereq.backend
设置为控制器,则如果控制器立即解析为后端,则它在后续读取时返回实际的后端,否则返回控制器。如果bereq.backend
被设定为导演,然后beresp.backend
引用为提取设置的后端。当在字符串上下文中使用这两种方法之一时,它将返回控制器或已解析后端的名称。后端类型的符号之间的比较现在可以正常工作::
if (bereq.backend == foo.backend()) { # do something specific to the foo backends }
持续时间类型可以在布尔上下文中使用,当持续时间小于或等于零时,评估为False,否则评估为True。
INT、DURATION和REAL值现在可以为负值。
响应代码¶
现在可以在VCL内部设置响应代码1000或更大。 resp.status
在客户响应中以1000为模进行传递。
IP地址比较¶
现在可以比较IP地址是否相等::
if (client.ip == remote.ip) {
call do_if_equal;
}
如果对象指定相同的套接字地址,则它们是相等的,不包括端口号。IPv6地址始终不等于IPv4地址(比较不能考虑v4映射的IPv6地址)。
装卸工类型和存储对象¶
用于存储后端的数据类型装卸现在在VCL和VMOD中可用。具有表单名称的存储对象 storage.SNAME
将存在于VCL实例中,其中 SNAME
是随提供的存储后端的名称 varnishd
命令行选项 -s
。如果没有 -s
给出了选项,然后 storage.s0
表示默认存储。该对象 storage.Transient
始终存在,指定为瞬时存储。看见 存储后端 ,以及关于的注释 beresp.storage
和 req.storage
下面。
所有VCL子例程(除 vcl_fini
)¶
增列
return(fail)
立即终止VCL处理。在所有情况下,除了vcl_synth
,控制被定向到vcl_synth
使用resp.status
和resp.reason
分别设置为503和“VCL失败”。vcl_synth
在以下时间中止return(fail)
。vcl_fini
当VCL实例处于卸载状态(进入冷状态)且没有故障条件时执行。在任何尝试将请求或响应的第一行中的一个字段设置为空字符串时,都会调用VCL失败,例如
req.url
,req.proto
,resp.reason
以此类推。
客户端VCL子例程¶
req.ttl
已弃用,请参见 VCL 。
vcl_recv¶
增列
req.storage
,它告诉Varnish在您选择保存请求正文时使用哪个存储后端(请参见 布尔CACHE_REQ_BODY(字节大小) )。return(vcl(LABEL))
可能不会在重新启动后调用。它只能从活动的VCL实例中调用。
vcl_backend_response¶
增列
return(pass(DURATION))
若要将对象设置为传球命中,请参见 击球传球又回来了 。该对象
beresp.storage
现在应该使用装卸工类型来设置存储后端;beresp.storage_hint
已弃用,并将在将来的版本中删除。设置beresp.storage_hint
将设置为有效的存储beresp.storage
也是。如果存储无效,beresp.storage
原封不动。
属性定义了多个存储后端 -s
Varnishd的命令行选项,但在 vcl_backend_response
、存储选择和核武器限制的使用已修改(见 nuke_limit )。以前,存储后端首先尝试核限制为0,失败时重试,限制配置为 -p
参数 nuke_limit
。当没有指定存储空间时,在重试之前,Varnish会按循环顺序检查每一个存储空间,核弹限制为0。
现在 beresp.storage
之前使用存储后端进行了初始化 vcl_backend_response
执行,并且存储设置在 beresp.storage
在其执行后将被使用。在所有情况下都使用配置的核武器限制。
vmod_std¶
其他变化¶
长期停用的存储后端类型umem已停用。
varnishstat(1)
:添加了
cache_hitmiss
统计命中未命中对象的点击数。这个
cache_hitpass
Stat现在只计算击球传球对象的命中率。fetch_failed
对于任何类型的提取失败,都会递增--当return(deliver)
从…vcl_backend_response
,或者当控制权转移到vcl_backend_error
。添加了
n_test_gunzip
Stat,它在Varnish验证来自后端的压缩响应时递增--此操作以前与n_gunzip
。添加了
bans_lurker_obj_killed_cutoff
统计被禁令潜伏者杀死的对象数量,以使禁令数量保持在较低水平ban_cutoff
。
varnishlog(1)
:命中未命中和命中传球对象的命中记录为
HitMiss
和HitPass
标签。在每种情况下,日志有效负载都是对象保存在缓存中的前一个事务的VXID(与Hit
)。条目中包含
TTL
标记和前缀HFP
以记录为传球对象设置的持续时间。增列
vxid
作为VSL查询的左侧令牌,允许查询在日志中搜索事务ID。看见 VSL-查询 。
varnishncsa(1)
:阐明了
%r
格式化程序,请参阅中的注释 瓦尼西克萨 。阐明了
%{X}i
和%{X}o
标题X多次出现(最后一次出现为)时的格式化程序。
varnishtest(1)
:添加了
setenv
和write_body
命令,请参见 VTC 。-reason
取代-msg
设置响应的原因字符串(默认为“OK”)。增列
-cliexpect
将预期的CLI响应与正则表达式匹配。添加了
-match
运算符shell
指挥部。添加了
-hdrlen
运算符生成具有给定名称和长度的标头。这个
err_shell
命令已弃用,请使用shell -err -expect
取而代之的是。这个
${bad_backend}
宏现在可以用于始终关闭的后端,这不需要端口定义(就像${bad_ip}
在后端定义中)。varnishtest
可以使用TERM
,INT
的KILL
信号,但不是用HUP
。这些信号会杀死进程组,从而停止由运行测试启动的进程。
添加了
vtest.sh
自动化测试构建的工具,请参见 项目工具改进 。