haproxy.cfg で HaProxy 環境変数を使用すると機能しない

haproxy.cfg で HaProxy 環境変数を使用すると機能しない

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 Service Unavailable が返されます。

backend FE
   # balance     roundrobin
    server      FE1 $FE_PORT_8000_TCP_ADDR:8000  maxconn 256

何が間違っているのか、何か考えはありますか?

更新: この人も同じような問題を抱えているようです haproxy.conf で環境変数を使用するにはどうすればいいですか?

答え1

service コマンドで停止/開始しているので、/etc/init.d/haproxyサービス ( service haproxy start) を制御している対話型ターミナル セッションではなく、init スクリプト (ubuntu など) で環境変数を指定する必要があります。proc ファイルシステムで特定の pid に使用可能な環境変数を確認できます。haproxy を確認すると、TERM と LANG のみである可能性があります。これは、サービス経由で init スクリプトに渡される唯一の環境であるためです (サービスのマニュアルページ)。

# cat /proc/$(pgrep haproxy)/environ

init スクリプトからデーモン化された haproxy を起動する代わりに、haproxy を直接実行すると、おそらく期待どおりの動作が見られるでしょう。

# haproxy -f /etc/haproxy/haproxy.cfg

これを解決するには、init スクリプトを編集し/etc/init.d/haproxy、そこに変数を設定します。

export FE_PORT_8000_TCP_ADDR=172.17.0.4

答え2

同じ問題がありました。環境変数を二重引用符で囲むことで修正しました。

説明したようにここ(2.3. 環境変数)

HAProxy の構成は環境変数をサポートします。これらの変数は二重引用符内でのみ解釈されます。変数は、構成の解析中に展開されます。変数名の前にはドル記号 ("$") を付け、Bourne シェルの場合と同様に、必要に応じて中括弧 ("{}") で囲む必要があります。変数名には英数字またはアンダースコア文字 ("_") を含めることができますが、数字で始まってはなりません。

答え3

私も同じ問題を抱えていましたが、Debian 8 (Jessie) で設定してもうまくいきませんでした。次のよう/etc/init.d/haproxyに変数を設定することで解決しました(不要)/etc/default/haproxyexport

FE_PORT_8000_TCP_ADDR=172.17.0.4

詳細については、質問そして答え私の問題について。

答え4

/etc/init.d/haproxyファイルに次のコード断片が含まれていると仮定します。

#!/bin/sh
...

BASENAME=haproxy
...

if [ -e /etc/default/${BASENAME} ]; then
    . /etc/default/${BASENAME}
fi
...

場合は、代わりにファイルを介して追加の変数を渡すのが適切な解決策になります/etc/default/haproxy

...ヨハン・ゴブ氏もそこで言及しているように:https://serverfault.com/a/841307/608437

関連情報