如何在 Varnish 配置中注入环境变量

Posted

技术标签:

【中文标题】如何在 Varnish 配置中注入环境变量【英文标题】:How to inject environment variables in Varnish configuration 【发布时间】:2014-01-30 03:25:03 【问题描述】:

我有 2 个环境变量:

echo $FRONT1_PORT_8080_TCP_ADDR # 172.17.1.80
echo $FRONT2_PORT_8081_TCP_ADDR # 172.17.1.77

我想将它们注入到我的 default.vcl 中,例如:

backend front1 
    .host = $FRONT1_PORT_8080_TCP_ADDR;

但我在 $ 字符上遇到语法错误。

我也尝试过使用 user variables,但我无法在 vcl_recv 之外定义它们。

如何在 VCL 中检索我的 2 个值?

【问题讨论】:

有人试过github.com/carlosabalde/libvmod-cfg 吗?它有助于访问 ENV 变量。 【参考方案1】:

我已经成功解析了我的 vcl

backend front1 
    .host = $FRONT1_PORT_8080_TCP_ADDR;

使用脚本:

envs=`printenv`

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

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

【讨论】:

【参考方案2】:

注意:它不适用于后端配置,但可以在其他地方使用。显然后端需要常量字符串,如果你尝试,你会得到Expected CSTR got 'std.fileread'

您可以使用fileread function of the std module,并为您的每个环境变量创建一个文件。

在运行 varnishd 之前,你可以运行:

mkdir -p /env; \
env | while read envline; do \
    k=$envline%%=*; \
    v=$envline#*=; \
    echo -n "$v" >"/env/$k"; \
done

然后,在您的清漆配置中:

import std;

...

backend front1 
    .host = std.fileread("/env/FRONT1_PORT_8080_TCP_ADDR");
    .port = std.fileread("/env/FRONT1_PORT_8080_TCP_PORT");

我还没有测试过。另外,我不知道给后端的端口配置一个字符串是否可行。在这种情况下,转换为整数应该可以:

.port = std.integer(std.fileread("/env/FRONT1_PORT_8080_TCP_PORT"), 0);

【讨论】:

【参考方案3】:

您可以使用 echo 来评估字符串。

通常你可以这样做:

VAR=test # Define variables

echo "my $VAR string" # Eval string

但是,如果文件中有文本,则可以使用“eval”来获得相同的行为:

VAR=test # Define variables

eval echo $(cat file.vcl) # Eval string from the given file

【讨论】:

【参考方案4】:

现在你可以使用VMOD Varnish标准模块(std)来获取VCL中的环境变量,例如:

set req.backend_hint = app.backend(std.getenv("VARNISH_BACKEND_HOSTNAME"));

查看文档:https://varnish-cache.org/docs/trunk/reference/vmod_std.html#std-getenv

【讨论】:

【参考方案5】:

听起来像是envsubst 的工作。

只需在您的配置 $MY_VAR 中使用标准 env var 语法和 ...

envsubst < myconfig.tmpl > myconfig.vcl

您可以在 Ubuntu 中使用 apt get install gettext 进行安装。

【讨论】:

以上是关于如何在 Varnish 配置中注入环境变量的主要内容,如果未能解决你的问题,请参考以下文章

将环境变量从 gulp 注入到 webpack

JDBC(本质,配置环境变量,JDBC编程六步,类加载注册,sql注入,事务问题,封装工具类,悲观锁,乐观锁)

如何配置python的环境变量

环境变量 | 如何理解 windows计算机中的环境变量,以及配置Java环境时配置的环境变量?

将环境变量注入图像的构建阶段

如何在Windows下为Qt配置环境变量