在 haproxy.cfg 中使用 HaProxy 环境变量不起作用

在 haproxy.cfg 中使用 HaProxy 环境变量不起作用

试图弄清楚为什么 haproxy.cfg 中的环境变量在 HA-Proxy 版本 1.5.2 中不起作用

在命令行上,使用 Printenv 我得到了环境变量列表,如 FE_PORT_8000_TCP_ADDR=172.17.0.4

我需要在 haproxy.cfg 中使用它。根据这个和文档 如何在 haproxy.conf 中使用环境变量 使用 $FE_PORT_8000_TCP_ADDR 或 ${FE_PORT_8000_TCP_ADDR} 应该可以。但是,这不起作用。

在 Haporxy.cfg 中硬编码确实有效,并且在浏览器中访问时它显示的内容与预期一致:

backend FE
   # balance     roundrobin
    server      FE1 172.17.0.4:8000  maxconn 256

但是具有相同假定值的环境变量却没有,在浏览器中它给出 503 服务不可用。

backend FE
   # balance     roundrobin
    server      FE1 $FE_PORT_8000_TCP_ADDR:8000  maxconn 256

对于哪里做错了有什么想法吗?

更新:此人似乎遇到了同样的问题 如何在 haproxy.conf 中使用环境变量

答案1

由于您使用服务命令停止/启动,因此您需要在 init 脚本中指定环境变量(例如/etc/init.d/haproxy在 ubuntu 上),而不是在您控制服务的交互式终端会话中指定环境变量(service haproxy start)。您可以在 proc 文件系统中验证特定 pid 可用的环境变量。如果您检查 haproxy,它可能只有 TERM 和 LANG,因为这是唯一通过服务传递给 init 脚本的环境(服务手册页)。

# cat /proc/$(pgrep haproxy)/environ

如果不是从 init 脚本启动守护进程的 haproxy,而是直接运行 haproxy,那么您可能会看到您正在寻找的行为:

# haproxy -f /etc/haproxy/haproxy.cfg

为了解决这个问题,请编辑初始化脚本/etc/init.d/haproxy并在那里设置变量:

export FE_PORT_8000_TCP_ADDR=172.17.0.4

答案2

有同样的问题。通过在环境变量周围添加双引号解决了此问题。

正如解释的那样这里(2.3. 环境变量)

HAProxy 的配置支持环境变量。这些变量仅在双引号内解释。变量在配置解析期间被扩展。变量名称必须以美元符号(“$”)开头,并可选择用括号(“{}”)括起来,类似于 Bourne shell 中的做法。变量名称可以包含字母数字字符或字符下划线(“_”),但不能以数字开头。

答案3

我遇到了同样的问题,但在 Debian 8 (Jessie) 上设置它/etc/init.d/haproxy不起作用。我通过/etc/default/haproxy像这样设置变量来修复它(不需要export

FE_PORT_8000_TCP_ADDR=172.17.0.4

欲了解更多信息,请参阅我的问题回答关于我的问题。

答案4

假设该/etc/init.d/haproxy文件包含以下代码片段:

#!/bin/sh
...

BASENAME=haproxy
...

if [ -e /etc/default/${BASENAME} ]; then
    . /etc/default/${BASENAME}
fi
...

,那么对你来说一个好的解决方案就是通过/etc/default/haproxy文件传递额外的变量。

... 正如 Johan Gov 所提到的:https://serverfault.com/a/841307/608437

相关内容