升级到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.ip 和 server.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_backend 和 workspace_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-查询 有关新查询语言的更多信息,请参见。