
私の haproxy.cfg ファイルには、ホスト名を使用する 2 つのバックエンド サーバーがあります。
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 に自動的に挿入されます。インスタンスの 1 つが停止しているときに 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
init-addr
haproxy >= 1.7 では、起動時に DNS 解決を防ぐために none を指定するオプションを使用できるはずです。
からドキュメント:
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 シェルの場合と同様に、名前の前にドル記号 ('$') を付け、必要に応じて中括弧 ('{}') で囲むことで、任意の数の環境変数を参照できます。