问题描述
我正在使用官方的 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 Enterprise 是 Varnish Cache 的商业版本,但如果您使用它,您仍然可以使用它而无需预付许可费用在 AWS、Azure 或 GCP 上。