HAProxy 配置文件中的主机名

HAProxy 配置文件中的主机名

我的 haproxy.cfg 文件有两个使用主机名的后端服务器:

server ops-ca-revealv2e-prod-1 ops-ca-revealv2e-prod-1:443 cookie ops-ca-revealv2e-prod-1 ssl weight 1 maxconn 512 check

server ops-ca-revealv2e-prod-2 ops-ca-revealv2e-prod-2:443 cookie ops-ca-revealv2e-prod-2 ssl weight 1 maxconn 512 check

这些主机名是 Amazon OpsWorks 的一部分,每当实例启动或关闭时,都会自动注入到 /etc/hosts 中。如果我在其中一个实例关闭时尝试重新启动 HAProxy,则会收到以下错误:

[ALERT] 362/225440 (27202) : parsing [/opt/haproxy-ssl/haproxy.cfg:42] : 'server ops-ca-revealv2e-prod-2' : invalid address: 'ops-ca-revealv2e-prod-2' in 'ops-ca-revealv2e-prod-2:443'
[ALERT] 362/225440 (27202) : Error(s) found in configuration file : /opt/haproxy-ssl/haproxy.cfg
[ALERT] 362/225440 (27202) : Fatal errors found in configuration.

有没有办法告诉 HAProxy 检查主机名是否有效?如果有效,则使用它,如果无效,则忽略它。

答案1

在 haproxy >= 1.7 中,您应该能够使用该init-addr选项,指定 none 以防止在启动时进行 DNS 解析。

来自文档

init-addr {last | libc | none | <ip>},[...]*

如果服务器使用 FQDN,则指示在启动时应按什么顺序解析服务器的地址。尝试依次应用逗号分隔列表中提到的每个方法来解析地址。使用第一个成功的方法。如果到达列表末尾而没有找到有效的方法,则会引发错误。方法“last”建议选择状态文件中出现的地址(请参阅“server-state-file”)。方法“libc”使用 libc 的内部解析器(gethostbyname() 或 getaddrinfo(),具体取决于操作系统和构建选项)。方法“none”明确指示服务器应在没有任何有效 IP 地址的情况下在关闭状态下启动。在启动时忽略一些 DNS 问题,等待情况稍后修复会很有用。最后,可以提供 IP 地址(IPv4 或 IPv6)。

因此你的配置行可能是:

server s1 myhostname init-addr none

答案2

不可以,从 haproxy 内部来说这是不可能的。

根据手册,配置行address中的server

[...] 服务器的 IPv4 或 IPv6 地址。或者,支持可解析的主机名 [...]

换句话说,不允许在配置中使用不可解析的主机名。

主意:

地址字符串的任何部分都可以引用任意数量的环境变量,通过在其名称前加上美元符号(“$”)并可选择用括号(“{}”)将它们括起来,类似于 Bourne shell 中的做法。

相关内容