我使用的是 Varnish 7.4 OSS,没有安装额外的 VMOD,为了便于阅读,我想将计算值存储在本地变量中,稍后我将在同一个
vcl_*
步骤中使用几行。
但我没有在文档中找到实现此目的的方法。
我尝试过:
set v1 = "hello";
new v1 = "hello2";
STRING v1;
但是都报错了。
我能够添加的唯一变量是 HTTP 标头,例如
set req.http.v1 = "hello"
,但当然,一旦我需要存储 TIME 值,它就会停止工作。
我该怎么做?
VCL 没有原生的变量概念。因此,标头经常被(滥用)使用:将值存储在标头中并稍后读取这些标头值。在同一个子例程中或在另一个子例程中。
如果要存储时间值,可以通过
set req.http.x-some-time = "2024-07-08T08:49:37"
语法分配字符串值,并使用 std.time()
函数将其转回有效的 TIME
类型。
请参阅 https://varnish-cache.org/docs/7.4/reference/vmod_std.html#std-time 了解有关
std
VMOD 及其 std.time()
功能的更多信息。
不要忘记将
import std;
添加到您的 VCL 文件中,以使命名空间可用于您的 VCL 代码。
有一个名为
vmod_var
的开源 VMOD,它在 Varnish 中提供变量支持。您可以从https://github.com/varnish/varnish-modules下载它。不过,您必须从源代码编译它。
请参阅 https://github.com/varnish/varnish-modules/blob/master/src/vmod_var.vcc 了解 API 和一些代码示例。
最终我们将在 https://packagecloud.io/varnishcache/ 上提供这些 VMOD 的软件包,但目前仍需要从源代码编译 VMOD。