升级到Varnish 4.0

对VCL的更改

VCL的后端获取部分在Varnish 4中发生了变化。我们已经尝试在这里汇编了一份需要升级的更改列表。

版本声明

为了确保人们已将他们的VCL升级到当前版本,Varnish现在要求VCL的第一行指示VCL版本号::

vcl 4.0;

Req.请求现在是req.method

为了更好地与RFC命名保持一致, req.request 已重命名为 req.method

VCL_FETCH现在是VCL_BACKEND_RESPONSE

已将控制器移至vmod_Director

为了使控制器(后端选择逻辑)更易于扩展,现在在可加载的VMOD中定义了控制器。

为将来的提取设置后端 vcl_recv 现已完成的工作如下:

sub vcl_init {
    new cluster1 = directors.round_robin();
    cluster1.add_backend(b1, 1.0);
    cluster1.add_backend(b2, 1.0);
}

sub vcl_recv {
    set req.backend_hint = cluster1.backend();
}

注意额外的 .backend() 在导演名字之后需要。

使用散列控制器作为客户端控制器

由于客户端控制器已经是散列控制器的特例,因此它已被删除,您应该直接使用散列控制器::

sub vcl_init {
    new h = directors.hash();
    h.add_backend(b1, 1);
    h.add_backend(b2, 1);
}

sub vcl_recv {
    set req.backend_hint = h.backend(client.identity);
}

VCL_ERROR现在为VCL_BACKEND_ERROR

为了区分内部产生的误差和VCL合成响应, vcl_backend_error 当Varnish在尝试获取对象时遇到错误时将被调用。

Error()现在是Synth()

并且您必须显式返回它::

return (synth(999, "Response"));

VCL_SYNTH中的合成响应

现在在res.http而不是obj.http上设置在vclsynth中创建的合成响应正文的标头。

合成关键字现在是一个函数::

if (resp.status == 799) {
    set resp.status = 200;
    set resp.http.Content-Type = "text/plain; charset=utf-8";
    synthetic("You are " + client.ip);
    return (deliver);
}

VCL_ERROR中的OBJ被VCL_BACKEND_ERROR中的beresp替换

为了更好地表示调用它的上下文,现在应该使用 beresp.* VCL_BACKEND_ERROR,您过去使用的位置 obj.* 在……里面 vcl_error

Hit_for_Pass对象是使用beresp.unacheable创建的

示例::

sub vcl_backend_response {
    if (beresp.http.X-No-Cache) {
        set beresp.uncacheable = true;
        set beresp.ttl = 120s;
        return (deliver);
    }
}

请求*在VCL_BACKEND_RESPONSE中不可用

请求 * used to be available in vcl_fetch, but after the split of functionality, you only have 'bereq.* ‘In vcl_backend_response

VCL_*保留

任何定制的潜艇都不能再被命名为‘VCL_*’。此命名空间是为内置Subs保留的。

Req.ackend.Health替换为std.Healthy(req.ackend_hint)

如果还没有导入STD模块,请记住要这样做。

Port和server.port分别替换为std.port(client.ip)和std.port(server.ip)

client.ipserver.ip 现在是正确的数据类型,默认情况下呈现为IP地址。您需要使用 std.port() 函数来获取端口号。

通过清除使无效

清除缓存无效现在通过以下方式完成 return(purge) 从… vcl_recv 。这个 purge; 关键字已停用。

OBJ现在是只读的

obj 现在是只读的。 obj.last_use 已经退休了。

某些返回值已被替换

除了新的 synth 如上所述的返回值,则发生了以下变化:

  • vcl_recv must now return hash instead of lookup

  • vcl_hash must now return lookup instead of hash

  • vcl_pass must now return fetch instead of pass

后端重启现在正在重试

在3.0中,有可能做到 return(restart) 注意到后台响应错误后,切换到不同的后台。

这现在被称为 return(retry) ,并跳回到 vcl_backend_fetch

这只影响后端FETCH线程,不影响客户端处理。

默认/内置VCL更改

自动附加到用户配置的VCL的VCL代码现在称为内置VCL。(之前为default.vcl.)

内置的VCL现在支持缓存控制:无缓存(和朋友),以指示来自后端的不可缓存的内容。

这个 remove 关键字不见了

替换为 unset

X-Forwarded-For现在设置在vcl_recv之前

在许多情况下,人们在实现自己的vclrecv时无意中删除了X-Forwarded-for。因此,它已被移到vclrecv之前,因此,如果您不想向其添加IP,则应在vclrecv中将其删除。

对现有参数的更改

session_linger

session_linger 已重命名为 timeout_linger 现在是以秒为单位(以前是毫秒)。

sess_timeout

sess_timeout 已重命名为 timeout_idle

sess_workspace

在3.0中,通常需要增加 sess_workspace 如果使用了大量VMOD、复杂的报头操作或ESI。

这不再是必要的,因为ESI暂存空间在4.0中的其他地方发生。

如果您使用了大量的VMOD,您可能需要增加 workspace_backendworkspace_client 基于您的VMOD正在工作的位置。

thread_pool_purge_delay

thread_pool_purge_delay 已重命名为 thread_pool_destroy_delay 现在是以秒为单位(以前是毫秒)。

线程池添加延迟和线程池失败延迟

它们现在以秒为单位(以前是毫秒)。

3.0版以来的新参数

vcc_allow_inline_c

现在,您可以在VCL中完全禁用内联C,并且默认情况下它处于禁用状态。

其他变化

新的日志筛选

日志框架有一种新的过滤语言,这意味着-m开关已经被新的-q开关所取代。看见 VSL-查询 有关新查询语言的更多信息,请参见。