VCL-STEP

内置子例程

手册部分:

7

DESCRIPTION

在处理客户端和后端请求期间以及在 vcl.loadvcl.discard

看见 Varnish加工状态 有关状态及其与核心代码函数和VCL子例程的关系的详细图形概述。

内置子例程总是以 return (<action>) ,在哪里 <action> 确定如何在请求处理状态机中继续处理。

操作的行为在子例程中是相同的,或者至少是相似的,因此只有在相关的地方才会记录差异。

中记录了常见操作 VCL操作 在下一节中。中记录了特定于一个或某些子例程的操作 VCL步骤

为所有用户提供了默认行为 Varnish加工状态内置VCL 密码。

VCL操作

操作与 return(<action>) 关键字,它将控制从子例程返回给Varnish。该操作确定Varnish中的处理如何继续,如中所示 Varnish加工状态

常见操作记录在此处,而特定于一个或某些子例程的其他操作记录在下一节中 VCL步骤 以及从哪个内置子例程可以使用哪个动作。

客户端和后端的通用操作

fail

过渡到 vcl_synth 在客户端,就像 return(synth(503, "VCL Failed")) ,但任何请求状态更改都被撤消,就好像 std.rollback() 被调用,并强制关闭连接。

适用于致命错误,对于这些错误,只能进行最小的错误处理。

客户端的常见操作

synth(status code, reason)

过渡到 vcl_synth 使用 resp.statusresp.reason 被预先设定为…的论点 synth()

pass

切换到PASS模式,使当前请求不使用缓存,也不将其响应放入缓存。控制权最终将传递给 vcl_pass

pipe

切换到管道模式。控制权最终将传递给 vcl_pipe

restart

重新启动事务。增加了 req.restarts 柜台。

如果重新启动的次数高于 max_restarts 参数,则将控制传递给 vcl_synth 至于 return(synth(503, "Too many restarts"))

对于重新启动,所有对 req 保留属性,但以下属性除外 req.restartsreq.xid ,这需要通过设计来改变。

后端的常见操作

abandon

放弃后端请求。除非后端请求是后台提取,否则控制权将传递给 vcl_synth 在客户端,使用 resp.status 预设为503。

VCL步骤

客户端

vcl_recv

在接收并分析完完整的请求后,在请求开始时调用,在 restart 或者作为ESI包含的结果。

其目的是决定是否送达请求,可能修改请求,并决定如何进一步处理请求。可以将后端提示设置为后端处理侧的默认提示。

这个 vcl_recv 子例程可以通过调用 return() 使用以下关键字之一:


fail
看见 fail 上一节

synth(status code, reason)

restart
看见 restart 上一节

pass
看见 pass 上一节

pipe
看见 pipe 上一节

hash
继续将该对象作为的潜在候选对象进行处理
缓存。将控制权移交给 vcl_hash

purge
清除对象及其变体。控制通过

vcl(label)
切换到标记的VCL label

这将回滚请求,就好像 std.rollback(req) 曾经是
中调用并继续进行VCL处理 vcl_recv VCL的
已贴标签 label 就好像它是活动的VCL一样。

这个 vcl(label) 退货只在 req.restarts
如果从活动VCL使用,则计数为零。

请参阅 Vcl.bel<标签><配置名称> 命令输入 Varnish-CLI
vcl_pipe

在进入管道模式时调用。在这种模式下,请求被传递到后端,来自客户端和后端的任何进一步数据都被原封不动地传递,直到任何一端关闭连接。基本上,Varnish将降级为一个简单的TCP代理,来回洗牌字节。对于管道模式下的连接,不会调用任何其他VCL子例程 vcl_pipe

这个 vcl_pipe 子例程可以通过调用 return() 使用以下关键字之一:


fail
看见 fail 上一节

synth(status code, reason)

pipe
继续使用管道模式。
vcl_pass

在进入PASS模式时调用。在这种模式下,请求被传递到后端,而后端的响应被传递到客户端,但不进入缓存。通过同一客户端连接提交的后续请求将得到正常处理。

这个 vcl_pass 子例程可以通过调用 return() 使用以下关键字之一:


fail
看见 fail 上一节

synth(status code, reason)

restart
看见 restart 上一节

fetch
继续使用PASS模式-发起后端请求。
vcl_hash

在之后调用 vcl_recv 若要为请求创建哈希值,请执行以下操作。它被用作在Varnish中查找对象的键。

这个 vcl_hash 子例程可以通过调用 return() 使用以下关键字之一:


fail
看见 fail 上一节

lookup
在缓存中查找对象。

控制权传给 vcl_purge 当来自一个 purge
返回到 vcl_recv

否则,控制权将根据
缓存查找的结果:

*一支安打:传球给 vcl_hit

*未命中或命中未命中对象(具有
obj.uncacheable == true): pass to vcl_miss

*命中传球对象(对于 pass(DURATION) 曾经是
以前从 vcl_backend_response ):传递给
vcl_purge

在清除已执行且其所有变体已被逐出后调用。

这个 vcl_purge 子例程可以通过调用 return() 使用以下关键字之一:


fail
看见 fail 上一节

synth(status code, reason)

restart
看见 restart 上一节
vcl_miss

如果在缓存中找不到请求的文档,或者如果 vcl_hit 退货 fetch

它的目的是决定是否尝试从后端检索文档。可以将后端提示设置为后端处理侧的默认提示。

这个 vcl_miss 子例程可以通过调用 return() 使用以下关键字之一:


fail
看见 fail 上一节

synth(status code, reason)

restart
看见 restart 上一节

pass
看见 pass 上一节

fetch
从后台获取请求的对象。控制将会
最终传递给 vcl_backend_fetch
vcl_hit

在缓存查找成功时调用。被击中的对象可能是陈旧的:它可以是零或负数 ttl 仅在 gracekeep 还剩时间了。

这个 vcl_hit 子例程可以通过调用 return() 使用以下关键字之一:

fail
看见 fail 上一节

synth(status code, reason)

restart
看见 restart 上一节

pass
看见 pass 上一节

deliver
交付对象。如果已过时,则后台获取以进行刷新
它被触发了。
vcl_deliver

在任何对象之前调用,但 vcl_synth 将结果传递给客户端。

这个 vcl_deliver 子例程可以通过调用 return() 使用以下关键字之一:


fail
看见 fail 上一节

synth(status code, reason)

restart
看见 restart 上一节

deliver
将对象交付给客户端。
vcl_synth

被调用来交付一个合成对象。合成对象是在VCL中生成的,不是从后台获取的。它的主体可以使用 synthetic() 功能。

A vcl_synth 定义的对象从不进入缓存,这与 vcl_backend_error 定义的对象,它可能会在缓存中结束。

子例程可以通过调用 return() 使用以下关键字之一:


fail
看见 fail 上一节

restart
看见 restart 上一节

deliver
直接交付由定义的对象 vcl_synth 给客户
不打个电话 vcl_deliver

后端

vcl_backend_fetch

在发送后端请求之前调用。在此子例程中,通常在请求到达后端之前更改请求。

这个 vcl_backend_fetch 子例程可以通过调用 return() 使用以下关键字之一:


fail
看见 fail 上一节

abandon
看见 abandon 上一节

fetch
从后端获取对象。

error(status code, reason)
过渡到 vcl_backend_error 使用 beresp.status
beresp.reason 被预先设定为…的论点 error() 如果
文中还提供了参数。

在呼叫之前 vcl_backend_fetch ,Varnish核心准备 bereq 后端请求如下:

  • 除非该请求是 pass

    • bereq.methodGETbereq.protoHTTP/1.1

    • bereq.http.Accept_Encodinggzip 如果 http_gzip_support 已启用。

  • 如果存在要重新验证的现有缓存对象,请设置 bereq.http.If-Modified-Since 来自ITS Last-Modified 标题和/或集合 bereq.http.If-None-Match 来自ITS Etag 标题

  • bereq.http.X-Varnish 设置为当前事务ID (vxid )

这些更改可以在中撤消或修改 vcl_backend_fetch 在发出后端请求之前。

具体地说,为了缓存非GET请求, req.method 需要保存到中的标题或变量 vcl_recv 并恢复到 bereq.method 。注意,缓存非GET请求通常还需要更改中的缓存键 vcl_hash 例如还通过散列请求方法和/或请求主体。

Head请求可以从缓存的GET响应中得到满足。

vcl_backend_response

在从后端成功检索到响应头部后调用。

这个 vcl_backend_response 子例程可以通过调用 return() 使用以下关键字之一:


fail
看见 fail 上一节

abandon
看见 abandon 上一节

deliver
对于304响应,创建更新的缓存对象。
否则,从后端获取对象体并启动
向任何等待的客户端请求提供服务,可能是并行的
(流媒体)。

retry
重试后端事务。增加了 retries 柜台。
如果重试次数高于 max_retries
控制权将传递给 vcl_backend_error

pass(duration)
在给定的持续时间内将该对象标记为一击即传。后续
命中此对象的查找将转换为已传递的事务,
仿佛 vcl_recv 已经回来了 pass

error(status code, reason)
过渡到 vcl_backend_error 使用 beresp.status
beresp.reason 被预先设定为…的论点 error() 如果
文中还提供了参数。
vcl_backend_error

如果后端获取失败或如果 max_retries 已被超过。

带着 abandon 不会留下缓存对象。

如果返回时带着 deliver 以及一个 beresp.ttl > 0s 合成缓存对象是在VCL中生成的,其主体可以使用 synthetic() 功能。

当对象上有等待列表时,默认设置为 ttl 将为正(当前为一秒),在进入前设置 vcl_backend_error 。这是为了避免请求序列化和在可能失败的后端上敲打。

由于这些合成对象是在这些特殊情况下缓存的,因此在那里放置私有信息时要谨慎。如果您确实必须这样做,那么您需要显式设置 beresp.ttl 调到零 vcl_backend_error

这个 vcl_backend_error 子例程可以通过调用 return() 使用以下关键字之一:


fail
看见 fail 上一节

abandon
看见 abandon 上一节

deliver
传递并可能缓存中定义的对象
vcl_backend_error as if it was fetched from the backend, also
称为“后端合成器”。

retry
重试后端事务。增加了 retries 柜台。
如果重试次数高于 max_retries
vcl_synth on the client side is called with resp.status
预设为503。

在vcl.Load/vcl.disard期间

vcl_init

在加载VCL时,在任何请求通过它之前调用。通常用于初始化VMOD。

这个 vcl_init 子例程可以通过调用 return() 使用以下关键字之一:


ok
正常返回,VCL继续加载。

fail
中止加载此VCL。
vcl_fini

仅在所有请求都已退出VCL后才丢弃VCL时调用。通常用于清理VMOD。

这个 vcl_fini 子例程可以通过调用 return() 使用以下关键字之一:


ok
正常返回,VCL将被丢弃。

另请参阅