VCL-变量¶
完整的专辑¶
- 手册部分:
7
DESCRIPTION¶
这是VCL语言中所有变量的列表。
变量名的形式为 scope.variable[.index]
,例如:
req.url
beresp.http.date
client.ip
下面描述了可以对每个变量执行哪些操作,通常使用缩写“Backend”,其中包含 vcl_backend_* {}
子例程和“客户端”,这涵盖了其余部分,除了 vcl_init {}
和 vcl_fini {}
。
本地、服务器、远程和客户端¶
这些变量描述了客户端和varnishd之间的网络连接。
无代理协议::
client server
remote local
v v
CLIENT ------------ VARNISHD
使用代理协议::
client server remote local
v v v v
CLIENT ------------ PROXY ------------ VARNISHD
client.identity
类型:字符串
可从:客户端、后端读取
可从:客户端写入
客户端的标识,用于在客户端控制器中进行负载平衡。默认为
client.ip
可以用更精确的信息覆盖此变量,例如从
Cookie:
标题。
client.ip
类型:IP
可从:客户端、后端读取
客户端的IP地址,可以是
remote.ip
或者代理协议告诉了我们什么。
server.hostname
类型:字符串
可读:全部
服务器的主机名,由 gethostname(3) 系统功能。
server.identity
类型:字符串
可读:全部
服务器的标识,由
-i
参数。如果一个
-i
参数不传递给varnishd,则返回 gethostname(3) 将使用系统功能。
server.ip
类型:IP
可从:客户端、后端读取
接收客户端连接的套接字的IP地址,可以是
server.ip
或者代理协议告诉了我们什么。
remote.ip
类型:IP
可从:客户端、后端读取
TCP连接另一端的IP地址。这可以是客户端IP,也可以是代理服务器的传出IP。
如果连接是UNIX域套接字,则该值为
0.0.0.0:0
local.endpoint VCL >= 4.1
类型:字符串
可从:客户端、后端读取
接受会话的‘-a’套接字的地址。
如果论点是
-a foo=:81
这将是“:81”
local.ip
类型:IP
可从:客户端、后端读取
例如,TCP连接的本地端的IP地址(和端口号
192.168.1.1:81
如果连接是UNIX域套接字,则该值为
0.0.0.0:0
local.socket VCL >= 4.1
类型:字符串
可从:客户端、后端读取
接受会话的‘-a’套接字的名称。
如果论点是
-a foo=:81
这应该是“foo”。请注意,所有‘-a’在表单上都有一个默认名称
a%d
如果未提供任何名称。
请求和请求_顶部¶
这些变量描述当前请求,并且当ESI:INCLUDE请求被处理时,REQ_TOP指向从客户端接收的请求。
请求
类型:http
可从:客户端读取
整个请求HTTP数据结构。主要用于传递给VMOD。
req.backend_hint
类型:后端
可从:客户端读取
可从:客户端写入
如果我们尝试获取,则将bereq.Backend设置为此属性。设置为控制器时,如果控制器已立即解析,则读取此变量将返回实际后端,否则将返回控制器。在字符串上下文中使用时,分别返回导演或后端的名称。
req.can_gzip
类型:Bool
可从:客户端读取
如果客户端提供
gzip
或x-gzip
在Accept-Encoding
标题。
req.esi VCL <= 4.0
类型:Bool
可从:客户端读取
可从:客户端写入
设置为
false
禁用ESI处理,而不考虑beresp.do_esi中的任何值。默认为true
。此变量被替换为resp.do_esi
在VCL 4.1中。
req.esi_level
类型:整型
可从:客户端读取
我们当前处于的ESI请求级别的计数。
req.grace
类型:持续时间
可从:客户端读取
可从:客户端写入
对象宽限的上限。
在查找过程中,最小请求宽限期和对象存储的宽限期值将被用作对象的宽限期。
req.hash
类型:斑点
可读:VCL_HIT、VCL_MISTH、VCL_PASS、VCL_PURGE、VCL_DELIVER
此请求的哈希键。主要用于传递到VMOD,但也可用于调试命中/未命中状态。
req.hash_always_miss
类型:Bool
可从:客户端读取
可从:客户端写入
默认:
false
。强制此请求未命中缓存,即使缓存中有完全匹配的对象也是如此。
这对于在提取失败的情况下强制更新缓存而不使现有条目无效非常有用。
req.hash_ignore_busy
类型:Bool
可从:客户端读取
可从:客户端写入
默认:
false
。在缓存查找期间忽略任何忙碌的对象。
只有当您有两台服务器相互横向查找内容以避免死锁时,您才希望这样做。
req.hash_ignore_vary
类型:Bool
可从:客户端读取
可从:客户端写入
默认:
false
。忽略对象在缓存查找期间改变标题。
这将返回第一个匹配项,而不考虑对象与客户端请求的兼容性。当变体与某些客户端无关,并且资源呈现方式的差异不会改变客户端解释它的方式时,这很有用。
小心使用。
req.http.*
类型:标题
可从:客户端读取
可从:客户端写入
不可从:客户端进行设置
请求头,比如
req.http.date
。RFC允许多个标头具有相同的名称,并且
set
和unset
将删除 all 具有给定名称的标题。标头名称
*
是VCL符号,因此不能以数字开头。要使用不能表示为VCL符号的有效标头,可以引用名称,如req.http."grammatically.valid"
。IANA注册表中的任何HTTP头都不需要引用,因此不建议使用引用的语法,但为了实现互操作性,引用的语法是可用的。一些不能为正确的HTTP获取或传递而篡改的标头是只读的。
Req.http.content-length
Req.http.transfer-encoding
req.is_hitmiss
类型:Bool
可从:客户端读取
如果此请求导致命中失误
req.is_hitpass
类型:Bool
可从:客户端读取
如果此请求导致命中传球
req.method
类型:字符串
可从:客户端读取
可从:客户端写入
请求方法(例如“Get”、“Head”、...)
req.proto VCL <= 4.0
类型:字符串
可从:客户端读取
可从:客户端写入
客户端使用的HTTP协议版本,通常为“HTTP/1.1”或“HTTP/2.0”。
req.proto VCL >= 4.1
类型:字符串
可从:客户端读取
客户端使用的HTTP协议版本,通常为“HTTP/1.1”或“HTTP/2.0”。
req.restarts
类型:整型
可从:客户端读取
此请求已重新启动的次数的计数。
req.storage
类型:装卸工
可从:客户端读取
可从:客户端写入
用于保存此请求正文的存储后端。
req.time
类型:时间
可从:客户端读取
完全接收请求的时间在重新启动后保持不变。
req.trace
req.transport
类型:字符串
可从:客户端读取
提出此请求的传输协议。
req.ttl
类型:持续时间
可从:客户端读取
可从:客户端写入
缓存查找返回命中的对象期限上限。
req.url
类型:字符串
可从:客户端读取
可从:客户端写入
请求的URL,例如“/robots.txt”。
req.xid
类型:整型
可从:客户端读取
此请求的唯一ID。
req_top.http.*
req_top.method
类型:字符串
可从:客户端读取
ESI请求树中顶级请求的请求方法。(例如:“Get”、“Head”)。与非ESI请求中的req.method相同。
req_top.proto
类型:字符串
可从:客户端读取
ESI请求树中顶级请求的HTTP协议版本。与非ESI请求中的req.proto相同。
req_top.time
类型:时间
可从:客户端读取
完全接收顶级请求的时间在重新启动过程中保持不变。
req_top.url
类型:字符串
可从:客户端读取
ESI请求树中顶级请求的请求URL。与非ESI请求中的req.url相同。
贝雷克¶
这是我们发送到后端的请求,它是从客户端构建的 req.*
通过过滤掉不应传递的“每跳”字段 (Connection:
, Range:
和类似)。
允许通过的字段略多一点 pass` fetches than for `miss` fetches, for instance `` 范围
。
贝雷克
类型:http
可从:后端读取
整个后端请求HTTP数据结构。主要用来作为VMOD的论据。
bereq.backend
类型:后端
可从:VCL_PIPE读取,后端
可写自:VCL_PIPE,后端
这是我们尝试从中获取的后端或控制器。设置为控制器时,如果控制器已立即解析,则读取此变量将返回实际后端,否则将返回控制器。在字符串上下文中使用时,分别返回导演或后端的名称。
bereq.between_bytes_timeout
bereq.body
bereq.connect_timeout
bereq.first_byte_timeout
bereq.hash
类型:斑点
可从:VCL_PIPE读取,后端
此请求的哈希键、
req.hash
。
bereq.http.*
Bereq.http.content-length
Bereq.http.transfer-encoding
bereq.is_bgfetch
类型:Bool
可从:后端读取
当客户端在优雅的对象上获得命中,并且此获取在后台被踢开以获得新的副本时,则为真。
bereq.is_hitmiss
类型:Bool
可从:后端读取
如果该后端请求是由命中失误引起的。
bereq.is_hitpass
类型:Bool
可从:后端读取
如果此后端请求是由点击传球引起的。
bereq.method
类型:字符串
可从:VCL_PIPE读取,后端
可写自:VCL_PIPE,后端
请求类型(例如“Get”、“Head”)。
常规(非管道、非传递)提取始终是“GET”
bereq.proto VCL <= 4.0
类型:字符串
可从:VCL_PIPE读取,后端
可写自:VCL_PIPE,后端
HTTP协议版本“HTTP/1.1”,除非传递或管道请求中包含“HTTP/1.0”
req.proto
bereq.proto VCL >= 4.1
类型:字符串
可从:VCL_PIPE读取,后端
HTTP协议版本“HTTP/1.1”,除非传递或管道请求中包含“HTTP/1.0”
req.proto
bereq.retries
类型:整型
可从:后端读取
此请求已重试的次数的计数。
bereq.time
类型:时间
可从:VCL_PIPE读取,后端
我们开始准备第一个后端请求的时间在每次重试时保持不变。
bereq.trace
bereq.uncacheable
类型:Bool
可从:后端读取
指示此请求是否由于 pass 在客户端或在击球传球对象上的命中。
bereq.url
类型:字符串
可从:VCL_PIPE读取,后端
可写自:VCL_PIPE,后端
请求的URL,复制自
req.url
bereq.xid
类型:整型
可从:VCL_PIPE读取,后端
此请求的唯一ID。
贝雷斯普¶
从后端收到的响应、一个缓存未命中、存储对象是从 beresp
。
贝雷斯普
类型:http
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
整个后端响应HTTP数据结构,用作VMOD函数的参数。
beresp.age
类型:持续时间
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
默认:年龄标题或零。
对象的年龄。
beresp.backend
类型:后端
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
这是我们从中获取的后端。如果将bereq.ackend设置为控制器,则这将是该控制器选择的后端。在字符串上下文中使用时,返回其名称。
beresp.backend.ip VCL <= 4.0
类型:IP
可读:VCL_BACKEND_RESPONSE
从中获取此响应的后端的IP。
beresp.backend.name
类型:字符串
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
从中提取此响应的后端的名称。与beres.Backend相同。
beresp.body
类型:正文
可写入来源:VCL_BACKEND_ERROR
用来制造合成体。
beresp.do_esi
类型:Bool
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
可写入来源:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
默认:
false
。将其设置为TRUE以解析ESI指令的对象。这对于客户端稍后的ESI处理是必要的。如果对象进入缓存时beresp.do_esi为FALSE,则客户端ESI处理将不可能(obj.can_esi将为FALSE)。
在设置beresp.Filters之后使用beresp.do_esi是VCL错误。
beresp.do_gunzip
类型:Bool
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
可写入来源:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
默认:
false
。设置为
true
在将对象存储在缓存中的同时对其进行枪击压缩。如果
http_gzip_support
禁用,则设置此变量不起作用。在设置beresp.Filters之后使用beresp.do_gan Zip是VCL错误。
beresp.do_gzip
类型:Bool
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
可写入来源:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
默认:
false
。设置为
true
在存储对象的同时对其进行压缩。如果
http_gzip_support
禁用,则设置此变量不起作用。在设置beresp.Filters之后使用beresp.do_gzip是VCL错误。
beresp.do_stream
类型:Bool
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
可写入来源:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
默认:
true
。将对象交付给客户端,同时将整个对象提取到Varnish中。
对于不可缓存的对象,已发送到客户端的正文部分的存储可能会提前释放,具体取决于使用的存储引擎。
如果beresp.do_esi为真或响应正文为空,则此变量无效。
beresp.filters
类型:字符串
可读:VCL_BACKEND_RESPONSE
可写自:VCL_BACKEND_RESPONSE
Varnish Fetch Processor(VFP)筛选器的列表。正文将通过。从左到右的顺序表示从后端到缓存的处理,最左边的过滤器在任何传输编码解码后首先在从后端接收的主体上运行。
VFP筛选器在进入缓存和/或被传递到客户端之前更改正文,在那里它可能会被res.Filters再次处理。
Varnish-cache中存在以下VFP筛选器:
gzip
:使用gzip压缩实体
testgunzip
:测试正文是否为有效的GZIP,否则拒绝
gunzip
:解压缩gzip内容
esi
:esi-处理纯文本内容
esi_gzip
:保存gzift代码段以进行高效的ESI处理该过滤器能够将单独压缩的片段的ESI拼接在一起,节省了客户端重新压缩的处理能力,但牺牲了一些压缩效率。
VMOD提供额外的VFP滤光片。
默认情况下,beresp.Filters的结构如下:
gunzip
如果出现以下情况,则为gzip内容添加beresp.do_gunzip
或beresp.do_esi
都是真的。
esi_gzip
在以下情况下添加beresp.do_esi
是正确的,与beresp.do_gzip
或者内容已经被压缩。
esi
在以下情况下添加beresp.do_esi
是真的吗
gzip
在以下情况下为未压缩内容添加beresp.do_gzip
是真的吗
testgunzip
如果出现以下情况,则为压缩内容添加beresp.do_gunzip
是假的。在设置了beresp.Filters之后,使用前面提到的任何
beresp.do_*
开关是VCL错误。
beresp.grace
类型:持续时间
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
可写入来源:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
默认:缓存-控制
stale-while-revalidate
指令,或default_grace
参数。设置为一个句点以启用宽限。
beresp.http.*
类型:标题
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
可写入来源:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
不可从:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
从服务器返回的HTTP标头。
看见 req.http 用于一般说明。
Beresp.http.content-length
Beresp.http.transfer-encoding
beresp.keep
类型:持续时间
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
可写入来源:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
默认:
default_keep
参数。设置一个句点以启用有条件的后端请求。
保持时间是除了TTL之外的高速缓存寿命。
Ttl已过期但保留时间剩余的对象可用于向后端发出有条件的(IF-Modify-Since/IF-None-Match)请求以刷新它们。
beresp.proto VCL <= 4.0
类型:字符串
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
可写入来源:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
后端回复的HTTP协议版本。
beresp.proto VCL >= 4.1
类型:字符串
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
后端回复的HTTP协议版本。
beresp.reason
类型:字符串
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
可写入来源:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
服务器返回的HTTP状态消息。
beresp.status
类型:整型
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
可写入来源:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
服务器返回的HTTP状态代码。
有关详细信息,请参阅 HTTP response status 一节。
beresp.storage
类型:装卸工
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
可写入来源:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
用于保存此对象的存储后端。
beresp.storage_hint VCL <= 4.0
类型:字符串
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
可写入来源:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
自VCL 4.1(Varnish6.0)起不再推荐使用。请改用beresp.storing。
提示Varnish,您希望将此对象保存到特定的存储后端。
beresp.time
类型:时间
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
就在之前完全接收到后端标头时
vcl_backend_response {}
已输入,或者何时输入vcl_backend_error {}
已输入。
beresp.transit_buffer
beresp.ttl
类型:持续时间
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
可写入来源:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
默认:缓存-控制
s-maxage
或max-age
指令,或根据Expires标头的截止日期计算的值,或default_ttl
参数。对象的剩余生存时间,以秒为单位。
beresp.uncacheable
类型:Bool
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
可写入来源:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
继承自bereq.unacheable,请看那里。
设置此变量会使对象不可缓存。
这可能会在高速缓存中产生命中未命中对象。
清除该变量不起作用,并将记录警告“忽略重置beresp.uncacheable的尝试”。
beresp.was_304
类型:Bool
可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR
什么时候
true
这表明我们从后端获得了对条件提取的304响应,并将其转换为beresp.status = 200
OBJ¶
这就是我们在缓存中发现的对象。它不能修改。
obj.age
类型:持续时间
可读:VCL_HIT、VCL_DELIVER
对象的年龄。
obj.can_esi
类型:Bool
可读:VCL_HIT、VCL_DELIVER
如果可以对对象进行ESI处理,即如果设置
resp.do_esi
或添加esi
至resp.filters
在……里面vcl_deliver {}
将导致对响应正文进行ESI处理。
obj.grace
类型:持续时间
可读:VCL_HIT、VCL_DELIVER
对象的宽限期(秒)。
obj.hits
类型:整型
可读:VCL_HIT、VCL_DELIVER
此对象上的缓存命中计数。
在……里面 vcl_deliver 值0表示缓存未命中。
obj.http.*
obj.keep
类型:持续时间
可读:VCL_HIT、VCL_DELIVER
对象的保持时间(秒)。
obj.proto
类型:字符串
可读:VCL_HIT
存储在对象中的HTTP协议版本。
obj.reason
类型:字符串
可读:VCL_HIT
存储在对象中的HTTP原因短语。
obj.status
obj.storage
类型:装卸工
可读:VCL_HIT、VCL_DELIVER
存储此对象的存储后端。
obj.time
类型:时间
可读:VCL_HIT、VCL_DELIVER
从生成对象的服务器的角度创建对象的时间。这大致相当于
now
-obj.age
。
obj.ttl
类型:持续时间
可读:VCL_HIT、VCL_DELIVER
对象的剩余生存时间,以秒为单位。
obj.uncacheable
类型:Bool
可从:VCL_DELIVER读取
对象是否不可缓存(传球、传球命中或命中未命中)。
RESP¶
这是我们发送给客户端的响应,它是从以下任一项构建的 beresp
(及格/失误), obj
(点击)或从整块布料创建(Synth)。
除了 resp.body
全 resp.*
变量在两个版本中均可用 vcl_deliver{}
和 vcl_synth{}
作为一个对称性问题。
RESP
类型:http
可读:VCL_DELIVER,VCL_SYNTH
整个响应HTTP数据结构,用作VMOD的参数。
resp.body
类型:正文
可写入来源:VCL_SYNTH
以产生一个合成的响应体,例如对于错误。
resp.do_esi VCL >= 4.1
类型:Bool
可读:VCL_DELIVER,VCL_SYNTH
可写自:VCL_DELIVER、VCL_SYNTH
默认:obj.can_esi
这可用于选择性地禁用ESI处理,即使在FETCH过程中发生了ESI解析(请参见beresp.do_esi)。当Varnish缓存彼此对等时,这很有用。
在设置res.Filters之后使用res.do_esi是VCL错误。
resp.filters
类型:字符串
可读:VCL_DELIVER,VCL_SYNTH
可写自:VCL_DELIVER、VCL_SYNTH
将推送的响应体的VDP筛选器列表。
在设置RESP.Filters之前,读取的值将是默认过滤器列表,由Varnish基于res.do_esi和请求标头确定。
设置Res.Filters后,更改以其他方式确定筛选器选择的任何条件都不会产生任何效果。一旦设置了res.Filters,使用res.do_esi就会出错。
resp.http.*
类型:标题
可读:VCL_DELIVER,VCL_SYNTH
可写自:VCL_DELIVER、VCL_SYNTH
不可从:VCL_DELIVER、VCL_SYNTH
将返回的HTTP标头。
看见 req.http 用于一般说明。
Resp.http.content-length
Resp.http.transfer-encoding
resp.is_streaming
类型:Bool
可读:VCL_DELIVER,VCL_SYNTH
如果响应将在从后端获取时进行流式处理,则返回True。
resp.proto VCL <= 4.0
类型:字符串
可读:VCL_DELIVER,VCL_SYNTH
可写自:VCL_DELIVER、VCL_SYNTH
用于响应的HTTP协议版本。
resp.proto VCL >= 4.1
类型:字符串
可读:VCL_DELIVER,VCL_SYNTH
用于响应的HTTP协议版本。
resp.reason
类型:字符串
可读:VCL_DELIVER,VCL_SYNTH
可写自:VCL_DELIVER、VCL_SYNTH
将返回的HTTP状态消息。
resp.status
类型:整型
可读:VCL_DELIVER,VCL_SYNTH
可写自:VCL_DELIVER、VCL_SYNTH
将返回的HTTP状态代码。
有关详细信息,请参阅 HTTP response status 一节。
如果验证成功,则在从vcldeliver返回(传递)对缓存内容的条件请求后,核心代码会将res.Status 200更改为304。
对于验证,首先
req.http.If-None-Match
与之相比resp.http.Etag
。如果根据弱验证规则(见RFC7232)比较它们相等,则发送304。第二,
req.http.If-Modified-Since
与之相比resp.http.Last-Modified
或者,如果它未设置或较弱,则根据上次基于Date
和Age
与创建对象的后端响应一起接收的标头。如果基于该比较该对象尚未被修改,则发送304。
resp.time
类型:时间
可读:VCL_DELIVER,VCL_SYNTH
我们开始准备回复的时间,就在进入之前
vcl_synth {}
或vcl_deliver {}
。
特殊变量¶
现在
类型:时间
可读:全部
自UNIX时代以来的当前时间,以秒为单位。
当转换为表达式中的字符串时,它返回如下格式的时间戳
Tue, 20 Feb 2018 09:30:31 GMT
now
在任何内置VCL子例程的持续时间内保持稳定,以使基于时间的计算可预测并避免边缘情况。换句话说,即使在VCL中花费了相当多的时间,
now
将始终表示进入相应内置VCL子例程的时间点。now
因此不适用于任何类型的时间测量。看见 空时间戳(字符串S) , 现在时间() 和 持续时间Timed_Call(SUB) 在……里面 VMOD标准-Varnish标准模块 。
会话¶
会话对应于Varnish与单个客户端连接的“对话”,通过该连接可以发生一个或多个请求/响应事务。它可以包括HTTP/1保活连接上的流量,或HTTP/2连接上的多路传输流量。
sess.idle_send_timeout
sess.send_timeout
sess.timeout_idle
sess.timeout_linger
sess.xid VCL >= 4.1
类型:整型
可从:客户端、后端读取
此会话的唯一ID。
存储¶
storage.<name>.free_space
类型:字节
可从:客户端、后端读取
指定的装卸工中的可用空间。仅适用于马洛克装卸工。
storage.<name>.happy
类型:Bool
可从:客户端、后端读取
指定装卸工的健康状态。在目前的任何装卸工中都不提供。
storage.<name>.used_space
类型:字节
可从:客户端、后端读取
已命名装卸工中的已用空间。仅适用于马洛克装卸工。
受保护的标头字段¶
这个 content-length
和 transfer-encoding
标头是只读的。必须保留它们,以确保HTTP/1成帧保持一致,并与客户端和后端保持适当的请求和响应同步。
当有理由更改帧时,VMOD仍然可以更新这些标头,例如请求或响应正文的转换。
HTTP响应状态¶
HTTP状态代码有3个数字XYZ,其中X必须介于1和5之间。由于HTTP客户端或服务器依赖于非标准甚至无效状态代码的情况并不少见,因此Varnish可以在100到999之间的任何状态下工作。
在VCL代码中,只要总值低于65536,甚至可以使用VWXYZ形式的状态代码,但只有XYZ部分将被发送到客户端,此时X必须也已变为非零。
VWXYZ形式状态代码可以在 resp.status
和 beresp.status
至 return(synth(...))
和 return(error(...))
,以指示要生成哪些合成内容:
sub vcl_recv {
if ([...]) {
return synth(12404);
}
}
sub vcl_synth {
if (resp.status == 12404) {
[...] // this specific 404
} else if (resp.status % 1000 == 404) {
[...] // all other 404's
}
}
这个 obj.status
变量将继承VWXYZ表单,但在BAN表达式中只有XYZ部件可用。VWXYZ表单严格限于VCL执行。
将HTTP标准化代码分配给 resp.status
或 beresp.status
还将设置 resp.reason
或 beresp.reason
添加到相应的状态消息。
304搬运¶
对于304响应,Varnish核心代码修改 beresp
在呼叫之前 vcl_backend_response :
如果GZIP状态改变,
Content-Encoding
未设置,并且任何Etag
被削弱了从现有缓存对象复制304响应中未出现的任何标头。
Content-Length
如果存在于现有缓存对象中,则复制,否则丢弃。状态设置为200。
beresp.was_304 标志着此条件响应处理已发生。
注意:后端条件请求独立于客户端条件请求,因此无论后端请求是否是有条件的,客户端都可以接收304响应。
Beresp.ttl/beresp.gras/beresp.Keep¶
在呼叫之前 vcl_backend_response 、核心代码集 beresp.ttl
基于响应状态和响应头 Age
, Cache-Control
或 Expires
和 Date
详情如下:
如果存在且有效,则
Age
从所有TTL计算中有效地推导出报头。对于状态代码200、203、204、300、301、304、404、410和414:
如果
Cache-Control
包含一个s-maxage
或max-age
字段(按照该优先顺序),则将TTL设置为相应的非负值,或者如果为负,则设置为0。否则,如果没有
Expires
标头存在,则使用默认ttl。否则,如果
Expires
包含之前的时间戳Date
则将TTL设置为0。否则,如果没有
Date
标头存在,或者Date
标头时间戳与本地时钟的差别不超过 clock_skew 参数,则将ttl设置为0如果
Expires
表示过去的时间戳或本地时钟和本地时钟之间的差异
Expires
否则为标题。
否则,将TTL设置为
Expires
和Date
对于状态代码302和307,计算是相同的,除了不使用默认的ttl,如果两者都不使用,则返回-1
Cache-Control
也不是Expires
是存在的。对于所有其他状态代码,返回ttl-1。
beresp.grace
默认设置为 default_grace 参数。
对于非负TTL,如果 Cache-Control
包含一个 stale-while-revalidate
字段值、 beresp.grace
如果非负则设置为该值,否则设置为0。
beresp.keep
默认设置为 default_keep 参数。
另请参阅¶
HISTORY¶
VCL是由Pul-Henning Kamp与Verden Gang AS、Redpill Linpro和Varnish Software合作开发的。本手册页面由Per Buer、Pul-Henning Kamp、Martin Blix Grydeland、Kristian LyngstøL、Lasse Karstensen等人撰写。
COPYRIGHT¶
本文档使用与Varnish本身相同的许可。有关详细信息,请参阅许可证。
版权所有(C)2006 Verdens Gang AS
版权所有(C)2006-2021 Varnish软件AS