升级到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_spacevsm_space 参数。

  • 增列 clock_stepthread_pool_reserveban_cutoff (见 clock_stepthread_pool_reserveban_cutoff )。

  • thread_pool_stack 不再被认为是试验性的,并且有更广泛的文档记录,请参见 thread_pool_stack

  • thread_queue_limit 仅适用于排队的客户端请求,请参见 thread_queue_limit

  • vcl_dirvmod_dir 已弃用,并将从未来版本中删除,请使用 vcl_pathvmod_path 相反(请参见 vcl_pathvmod_path )。

  • 所有参数都在每个平台上定义,包括那些不能在每个平台上运行的参数。其中大多数涉及到TCP堆栈的功能,例如 tcp_keepalive_intvltcp_keepalive_probesaccept_filtertcp_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.storagereq.storage 下面。

所有VCL子例程(除 vcl_fini )

  • 增列 return(fail) 立即终止VCL处理。在所有情况下,除了 vcl_synth ,控制被定向到 vcl_synth 使用 resp.statusresp.reason 分别设置为503和“VCL失败”。 vcl_synth 在以下时间中止 return(fail)vcl_fini 当VCL实例处于卸载状态(进入冷状态)且没有故障条件时执行。

  • 在任何尝试将请求或响应的第一行中的一个字段设置为空字符串时,都会调用VCL失败,例如 req.urlreq.protoresp.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)

    • 命中未命中和命中传球对象的命中记录为 HitMissHitPass 标签。在每种情况下,日志有效负载都是对象保存在缓存中的前一个事务的VXID(与 Hit )。

    • 条目中包含 TTL 标记和前缀 HFP 以记录为传球对象设置的持续时间。

    • 增列 vxid 作为VSL查询的左侧令牌,允许查询在日志中搜索事务ID。看见 VSL-查询

  • varnishncsa(1)

    • 阐明了 %r 格式化程序,请参阅中的注释 瓦尼西克萨

    • 阐明了 %{X}i%{X}o 标题X多次出现(最后一次出现为)时的格式化程序。

  • varnishtest(1)

    • 添加了 setenvwrite_body 命令,请参见 VTC

    • -reason 取代 -msg 设置响应的原因字符串(默认为“OK”)。

    • 增列 -cliexpect 将预期的CLI响应与正则表达式匹配。

    • 添加了 -match 运算符 shell 指挥部。

    • 添加了 -hdrlen 运算符生成具有给定名称和长度的标头。

    • 这个 err_shell 命令已弃用,请使用 shell -err -expect 取而代之的是。

    • 这个 ${bad_backend} 宏现在可以用于始终关闭的后端,这不需要端口定义(就像 ${bad_ip} 在后端定义中)。

    • varnishtest 可以使用 TERMINTKILL 信号,但不是用 HUP 。这些信号会杀死进程组,从而停止由运行测试启动的进程。

  • 添加了 vtest.sh 自动化测试构建的工具,请参见 项目工具改进