VCL-STEP¶
内置子例程¶
- 手册部分:
7
DESCRIPTION¶
在处理客户端和后端请求期间以及在 vcl.load
和 vcl.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.status
和resp.reason
被预先设定为…的论点synth()
。
pass
¶
切换到PASS模式,使当前请求不使用缓存,也不将其响应放入缓存。控制权最终将传递给 vcl_pass 。
pipe
¶
切换到管道模式。控制权最终将传递给 vcl_pipe 。
restart
¶
重新启动事务。增加了
req.restarts
柜台。如果重新启动的次数高于 max_restarts 参数,则将控制传递给 vcl_synth 至于
return(synth(503, "Too many restarts"))
对于重新启动,所有对
req
保留属性,但以下属性除外req.restarts
和req.xid
,这需要通过设计来改变。
后端的常见操作¶
abandon
¶
放弃后端请求。除非后端请求是后台提取,否则控制权将传递给 vcl_synth 在客户端,使用
resp.status
预设为503。
VCL步骤¶
客户端¶
vcl_recv¶
在接收并分析完完整的请求后,在请求开始时调用,在 restart 或者作为ESI包含的结果。
其目的是决定是否送达请求,可能修改请求,并决定如何进一步处理请求。可以将后端提示设置为后端处理侧的默认提示。
这个 vcl_recv 子例程可以通过调用 return()
使用以下关键字之一:
fail
看见 fail 上一节synth(status code, reason)
看见 synth(status code, reason) 上一节restart
看见 restart 上一节pass
看见 pass 上一节pipe
看见 pipe 上一节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()
使用以下关键字之一:
vcl_pass¶
在进入PASS模式时调用。在这种模式下,请求被传递到后端,而后端的响应被传递到客户端,但不进入缓存。通过同一客户端连接提交的后续请求将得到正常处理。
这个 vcl_pass 子例程可以通过调用 return()
使用以下关键字之一:
fail
看见 fail 上一节synth(status code, reason)
看见 synth(status code, reason) 上一节restart
看见 restart 上一节fetch
继续使用PASS模式-发起后端请求。
vcl_hash¶
在之后调用 vcl_recv 若要为请求创建哈希值,请执行以下操作。它被用作在Varnish中查找对象的键。
这个 vcl_hash 子例程可以通过调用 return()
使用以下关键字之一:
vcl_purge¶
在清除已执行且其所有变体已被逐出后调用。
这个 vcl_purge 子例程可以通过调用 return()
使用以下关键字之一:
fail
看见 fail 上一节synth(status code, reason)
看见 synth(status code, reason) 上一节restart
看见 restart 上一节
vcl_miss¶
如果在缓存中找不到请求的文档,或者如果 vcl_hit 退货 fetch
。
它的目的是决定是否尝试从后端检索文档。可以将后端提示设置为后端处理侧的默认提示。
这个 vcl_miss 子例程可以通过调用 return()
使用以下关键字之一:
fail
看见 fail 上一节synth(status code, reason)
看见 synth(status code, reason) 上一节restart
看见 restart 上一节pass
看见 pass 上一节fetch
从后台获取请求的对象。控制将会最终传递给 vcl_backend_fetch 。
vcl_hit¶
在缓存查找成功时调用。被击中的对象可能是陈旧的:它可以是零或负数 ttl 仅在 grace 或 keep 还剩时间了。
这个 vcl_hit 子例程可以通过调用 return()
使用以下关键字之一:
fail
看见 fail 上一节synth(status code, reason)
看见 synth(status code, reason) 上一节restart
看见 restart 上一节pass
看见 pass 上一节deliver
交付对象。如果已过时,则后台获取以进行刷新它被触发了。
vcl_deliver¶
在任何对象之前调用,但 vcl_synth 将结果传递给客户端。
这个 vcl_deliver 子例程可以通过调用 return()
使用以下关键字之一:
fail
看见 fail 上一节synth(status code, reason)
看见 synth(status code, reason) 上一节restart
看见 restart 上一节deliver
将对象交付给客户端。
vcl_synth¶
被调用来交付一个合成对象。合成对象是在VCL中生成的,不是从后台获取的。它的主体可以使用 synthetic()
功能。
A vcl_synth 定义的对象从不进入缓存,这与 vcl_backend_error 定义的对象,它可能会在缓存中结束。
子例程可以通过调用 return()
使用以下关键字之一:
后端¶
vcl_backend_fetch¶
在发送后端请求之前调用。在此子例程中,通常在请求到达后端之前更改请求。
这个 vcl_backend_fetch 子例程可以通过调用 return()
使用以下关键字之一:
在呼叫之前 vcl_backend_fetch ,Varnish核心准备 bereq 后端请求如下:
除非该请求是 pass ,
集
bereq.method
至GET
和bereq.proto
至HTTP/1.1
和集
bereq.http.Accept_Encoding
至gzip
如果 http_gzip_support 已启用。
如果存在要重新验证的现有缓存对象,请设置
bereq.http.If-Modified-Since
来自ITSLast-Modified
标题和/或集合bereq.http.If-None-Match
来自ITSEtag
标题集
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()
使用以下关键字之一:
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()
使用以下关键字之一:
在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将被丢弃。
另请参阅¶
COPYRIGHT¶
本文档使用与Varnish本身相同的许可。有关详细信息,请参阅许可证。
版权所有(C)2006 Verdens Gang AS
版权所有(C)2006-2021 Varnish软件AS