不能在清漆 6.5.1 中使用 std vmod

问题描述

我正在使用官方的 varnish:6.5.1 docker 镜像并拥有这个 vcl:

vcl 4.0;

import std;

backend default {
    .host = std.getenv("PROXY_HOST");
    .port = std.getenv("PROXY_PORT");
}
.....

当我尝试运行图像(使用 docker-compose)时,它立即失败并显示错误

varnish_1  | Could not delete 'vcl_boot.1612728251.581028/vgc.sym': No such file or directory
varnish_1  | Error:
varnish_1  | Message from VCC-compiler:
varnish_1  | Expected CSTR got 'std'
varnish_1  | (program line 369),at
varnish_1  | ('/etc/varnish/default.vcl' Line 13 Pos 17)
varnish_1  |         .host = std.getenv("PROXY_HOST");

这是怎么失败的?我理解无法连接到后端,但 VCL 解析应该没问题,关于 getenv 的 std VMOD 文档非常简单。

在这里遗漏了什么?

编辑

backend default {
    .host = "${PROXY_HOST}";
    .port = "${PROXY_PORT}";
}

结合

#!/bin/bash
envs=`printenv`

for env in $envs
do
    IFS== read name value <<< "$env"

    sed -i "s|\${${name}}|${value}|g" /etc/varnish/default.vcl
done

varnishd -f /etc/varnish/default.vcl

按照 this 帖子工作,但这似乎不是最佳选择。

解决方法

Varnish Cache 只支持静态后端

Varnish Cache,Varnish 的开源版本不支持动态后端。

加载和编译 VCL 文件时,.host.port 值需要是字符串,而不是表达式。

错误消息也表明了这一点:

Expected CSTR got 'std'

编译器说它需要一个 C 字符串,这意味着一些以引号开头的东西,但它找到了 std

Varnish Enterprise 中的动态后端支持

Varnish Enterprise,Varnish 的商业版本,确实支持动态后端。 有关详细信息,请参阅 https://docs.varnish-software.com/varnish-cache-plus/vmods/goto/

免责声明:虽然 Varnish EnterpriseVarnish Cache 的商业版本,但如果您使用它,您仍然可以使用它而无需预付许可费用在 AWS、Azure 或 GCP 上。