试图弄清楚为什么 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
答案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