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

可从:客户端读取

如果客户端提供 gzipx-gzipAccept-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允许多个标头具有相同的名称,并且 setunset 将删除 all 具有给定名称的标题。

标头名称 * 是VCL符号,因此不能以数字开头。要使用不能表示为VCL符号的有效标头,可以引用名称,如 req.http."grammatically.valid" 。IANA注册表中的任何HTTP头都不需要引用,因此不建议使用引用的语法,但为了实现互操作性,引用的语法是可用的。

一些不能为正确的HTTP获取或传递而篡改的标头是只读的。

Req.http.content-length

类型:标题

可从:客户端读取

内容长度标头字段受保护,请参见 protected_headers.

Req.http.transfer-encoding

类型:标题

可从:客户端读取

传输编码标头字段受保护,请参见 protected_headers.

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

类型:Bool

可从:客户端读取

可从:客户端写入

控制是否 VCL_trace 为当前请求发出VSL记录,请参见 VSL

默认设置为 feature trace 参数,请参见 华而不实 。不会通过回滚重置。

req.transport

类型:字符串

可从:客户端读取

提出此请求的传输协议。

req.ttl

类型:持续时间

可从:客户端读取

可从:客户端写入

缓存查找返回命中的对象期限上限。

req.url

类型:字符串

可从:客户端读取

可从:客户端写入

请求的URL,例如“/robots.txt”。

req.xid

类型:整型

可从:客户端读取

此请求的唯一ID。

req_top.http.*

类型:标题

可从:客户端读取

ESI请求树中顶级请求的HTTP标头。与req.http相同。在非ESI请求中。

看见 req.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

类型:持续时间

可从:后端读取

可写自:后端

默认: .between_bytes_timeout 属性中的 后端定义 ,它默认为 between_bytes_timeout 参数,请参见 华而不实

从后端收到的每个字节之间等待的时间(以秒为单位)。在管道模式下不可用。

bereq.body

类型:正文

不可从:VCL_BACKEND_FETCH

请求正文。

取消设置也将删除 bereq.http.content-length.

bereq.connect_timeout

类型:持续时间

可从:VCL_PIPE读取,后端

可写自:VCL_PIPE,后端

默认: .connect_timeout 属性中的 后端定义 ,它默认为 connect_timeout 参数,请参见 华而不实

等待建立后端连接的时间(秒)。

bereq.first_byte_timeout

类型:持续时间

可从:后端读取

可写自:后端

默认: .first_byte_timeout 属性中的 后端定义 ,它默认为 first_byte_timeout 参数,请参见 华而不实

等待从后端取回第一个字节的时间(以秒为单位)。在管道模式下不可用。

bereq.hash

类型:斑点

可从:VCL_PIPE读取,后端

此请求的哈希键、 req.hash

bereq.http.*

类型:标题

可从:VCL_PIPE读取,后端

可写自:VCL_PIPE,后端

不可设置自:VCL_PIPE,后端

要发送到后端的Header。

看见 req.http 用于一般说明。

Bereq.http.content-length

类型:标题

可从:后端读取

内容长度标头字段受保护,请参见 protected_headers.

Bereq.http.transfer-encoding

类型:标题

可从:后端读取

传输编码标头字段受保护,请参见 protected_headers.

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

类型:Bool

可从:后端读取

可写自:后端

控制是否 VCL_trace 为当前请求发出VSL记录,请参见 VSL

继承的值 req.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_gunzipberesp.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

类型:标题

可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR

内容长度标头字段受保护,请参见 protected_headers.

Beresp.http.transfer-encoding

类型:标题

可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR

传输编码标头字段受保护,请参见 protected_headers.

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

类型:字节

可读:VCL_BACKEND_RESPONSE

可写自:VCL_BACKEND_RESPONSE

默认: transit_buffer 参数,请参见 华而不实

在以下情况下,客户端在流传递过程中可以领先于后端的最大字节数 beresp 是不可逾越的。另请参阅 transit_buffer 中的参数文档 华而不实

beresp.ttl

类型:持续时间

可读:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR

可写入来源:VCL_BACKEND_RESPONSE、VCL_BACKEND_ERROR

默认:缓存-控制 s-maxagemax-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 或添加 esiresp.filters 在……里面 vcl_deliver {} 将导致对响应正文进行ESI处理。

obj.grace

类型:持续时间

可读:VCL_HIT、VCL_DELIVER

对象的宽限期(秒)。

obj.hits

类型:整型

可读:VCL_HIT、VCL_DELIVER

此对象上的缓存命中计数。

在……里面 vcl_deliver 值0表示缓存未命中。

obj.http.*

类型:标题

可读:VCL_HIT

存储在对象中的HTTP标头。

看见 req.http 用于一般说明。

obj.keep

类型:持续时间

可读:VCL_HIT、VCL_DELIVER

对象的保持时间(秒)。

obj.proto

类型:字符串

可读:VCL_HIT

存储在对象中的HTTP协议版本。

obj.reason

类型:字符串

可读:VCL_HIT

存储在对象中的HTTP原因短语。

obj.status

类型:整型

可读:VCL_HIT

存储在对象中的HTTP状态代码。

有关详细信息,请参阅 HTTP response 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.bodyresp.* 变量在两个版本中均可用 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

类型:标题

可读:VCL_DELIVER,VCL_SYNTH

内容长度标头字段受保护,请参见 protected_headers.

Resp.http.transfer-encoding

类型:标题

可读:VCL_DELIVER,VCL_SYNTH

传输编码标头字段受保护,请参见 protected_headers.

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 或者,如果它未设置或较弱,则根据上次基于 DateAge 与创建对象的后端响应一起接收的标头。如果基于该比较该对象尚未被修改,则发送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

类型:持续时间

可从:客户端读取

可从:客户端写入

为客户端连接上的各个数据段发送超时,默认为 idle_send_timeout 参数,请参见 华而不实

sess.send_timeout

类型:持续时间

可从:客户端读取

可从:客户端写入

普通HTTP1响应的总超时,默认为 send_timeout 参数,请参见 华而不实

sess.timeout_idle

类型:持续时间

可从:客户端读取

可从:客户端写入

此会话的空闲超时,默认为 timeout_idle 参数,请参见 华而不实

sess.timeout_linger

类型:持续时间

可从:客户端读取

可从:客户端写入

此会话的延迟超时,默认为 timeout_linger 参数,请参见 华而不实

sess.xid VCL >= 4.1

类型:整型

可从:客户端、后端读取

此会话的唯一ID。

存储

storage.<name>.free_space

类型:字节

可从:客户端、后端读取

指定的装卸工中的可用空间。仅适用于马洛克装卸工。

storage.<name>.happy

类型:Bool

可从:客户端、后端读取

指定装卸工的健康状态。在目前的任何装卸工中都不提供。

storage.<name>.used_space

类型:字节

可从:客户端、后端读取

已命名装卸工中的已用空间。仅适用于马洛克装卸工。

受保护的标头字段

这个 content-lengthtransfer-encoding 标头是只读的。必须保留它们,以确保HTTP/1成帧保持一致,并与客户端和后端保持适当的请求和响应同步。

当有理由更改帧时,VMOD仍然可以更新这些标头,例如请求或响应正文的转换。

HTTP响应状态

HTTP状态代码有3个数字XYZ,其中X必须介于1和5之间。由于HTTP客户端或服务器依赖于非标准甚至无效状态代码的情况并不少见,因此Varnish可以在100到999之间的任何状态下工作。

在VCL代码中,只要总值低于65536,甚至可以使用VWXYZ形式的状态代码,但只有XYZ部分将被发送到客户端,此时X必须也已变为非零。

VWXYZ形式状态代码可以在 resp.statusberesp.statusreturn(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.statusberesp.status 还将设置 resp.reasonberesp.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 基于响应状态和响应头 AgeCache-ControlExpiresDate 详情如下:

  • 如果存在且有效,则 Age 从所有TTL计算中有效地推导出报头。

  • 对于状态代码200、203、204、300、301、304、404、410和414:

    • 如果 Cache-Control 包含一个 s-maxagemax-age 字段(按照该优先顺序),则将TTL设置为相应的非负值,或者如果为负,则设置为0。

    • 否则,如果没有 Expires 标头存在,则使用默认ttl。

    • 否则,如果 Expires 包含之前的时间戳 Date 则将TTL设置为0。

    • 否则,如果没有 Date 标头存在,或者 Date 标头时间戳与本地时钟的差别不超过 clock_skew 参数,则将ttl设置为

      • 0如果 Expires 表示过去的时间戳或

      • 本地时钟和本地时钟之间的差异 Expires 否则为标题。

    • 否则,将TTL设置为 ExpiresDate

  • 对于状态代码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等人撰写。