我的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的一部分,每当实例启动或closures时都会自动注入到/ etc / hosts中。 如果我尝试重新启动HAProxy时,其中一个实例closures,我收到错误:
[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检查主机名是否有效? 如果它是有效的,使用它,如果没有,忽略它。
在haproxy> = 1.7中,您应该能够使用init-addr选项,指定none以防止启动时的DNSparsing。
从文档 :
init-addr {last | libc | none | <ip>},[...]*
如果服务器的地址使用FQDN,那么在启动时应该指明服务器的地址应该按什么顺序解决。 试图通过依次应用逗号分隔列表中提到的每个方法来解决地址问题。 使用成功的第一种方法。 如果列表的末尾没有find工作方法,则会抛出错误。 方法“last”build议select出现在状态文件中的地址(参见“server-state-file”)。 方法“libc”根据操作系统和构build选项使用libc的内部parsing器(gethostbyname()或getaddrinfo())。 方法“无”具体指示服务器应该在没有任何有效IP地址的情况下启动。 在启动时忽略一些DNS问题可能会很有用,等待稍后再修复。 最后,可以提供IP地址(IPv4或IPv6)。
所以你的configuration线可以是:
server s1 myhostname init-addr none
不,从haproxy内部是不可能的。
根据手册, serverconfiguration行中的address是
服务器的IPv4或IPv6地址。 或者,支持可parsing的主机名[…]
换句话说,不允许在configuration中使用不可parsing的主机名。
理念:
地址string的任何部分都可以引用任意数量的环境variables,方法是使用美元符号('$')在名称前加上括号('{}'),类似于Bourne shell中所做的。