
我的 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」建議選擇狀態檔案中出現的位址(請參閱「伺服器狀態檔案」)。方法「libc」使用 libc 的內部解析器(gethostbyname() 或 getaddrinfo(),取決於作業系統和建置選項)。方法「none」具體指示伺服器應在沒有任何有效 IP 位址的情況下啟動並處於關閉狀態。在啟動時忽略某些 DNS 問題並等待稍後解決問題可能會很有用。最後,可以提供 IP 位址(IPv4 或 IPv6)。
所以你的配置行可能是:
server s1 myhostname init-addr none
答案2
不,從 haproxy 內部這是不可能的。
根據手冊,配置行address
中server
是
[...] 伺服器的 IPv4 或 IPv6 位址。或者,支援可解析的主機名稱[...]
換句話說,不允許在配置中使用不可解析的主機名稱。
主意:
地址字串的任何部分都可以引用任意數量的環境變量,方法是在名稱前添加美元符號('$'),並可選擇用大括號('{}') 將它們括起來,類似於Bourne shell中的操作。