いつも小ネタのかっぱこと川原 洋平(@inokara)です。どうも。暫くは小ネタでいきます Yo!

HA Proxy の設定ファイルって分割したり include 出来たりしないのかしら

結論

出来ます

なんで?

いや、設定ファイルが長くのなるのはメンテナンス性も悪くなるから

基礎知識

HA Proxy の設定(デフォルトでは haproxy.cfg)を見ると以下のようなディレクティブに分かれているのが見て取れます。

  • global
  • default
  • frontend
  • backend
  • listen

上記のディレクティブ毎に設定を持てればメンテナンス性も上がりそうです。

やり方

設定ファイルの分割

簡単です。例えば global と default は一緒のファイルにしておいて、frontend と backend は分けたい場合には以下のように設定ファイルを分けます。

haproxy.cfg

global
        log 127.0.0.1   local0
        user haproxy
        group haproxy
        daemon

listen  private_monitoring :8101
        mode http
        stats enable
        stats uri /stats
        stats refresh 5s

global ディレクティブには HA Proxy のプロセス全体の設定を書きましょう。あと、listen にはモニタリングの設定を入れておきます。

frontend.cfg

frontend test-cluster1
        bind 0.0.0.0:80
        mode http
        timeout client 1s
        default_backend hogehoge-backend
        option forwardfor
        option  httplog clf
        log global refresh 5s

frontend ディレクティブには HA Proxy で受け付けたいポートやそれに準ずる設定を入れておきます。

backend.cfg

backend hogehoge-backend
        mode http
        timeout server 2s
        option httpchk GET /check HTTP/1.0
        option http-keep-alive
        balance roundrobin
        server web1 ${backend_host}:1919 check

backend ディレクティブには default_backend で指定しているバックエンドのサーバーの設定を入れておきます。

起動

haproxy を起動する際に以下のように起動することで上記で分割した設定ファイルを読み込むことが可能です。

/usr/sbin/haproxy -V -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/frontend.cfg -f /etc/haproxy/backend.cfg

また、/etc/init.d/haproxy のスクリプトから起動するのであればスクリプトに手心を加える必要があります。

--- haproxy.original    2014-07-26 01:13:03.419628627 +0000
+++ haproxy     2014-07-26 01:12:06.432551055 +0000
@@ -37,14 +37,16 @@
 RETVAL=0

 start() {
-  /usr/sbin/$BASENAME -c -q -f /etc/$BASENAME/$BASENAME.cfg
+  /usr/sbin/$BASENAME -c -q -f /etc/$BASENAME/$BASENAME.cfg 
+                            -f /etc/$BASENAME/frontend.cfg 
+                            -f /etc/$BASENAME/backend.cfg
   if [ $? -ne 0 ]; then
     echo "Errors found in configuration file, check it with '$BASENAME check'."
     return 1
   fi

   echo -n "Starting $BASENAME: "
-  daemon /usr/sbin/$BASENAME -D -f /etc/$BASENAME/$BASENAME.cfg -p /var/run/$BASENAME.pid
+  daemon /usr/sbin/$BASENAME -D -f /etc/$BASENAME/$BASENAME.cfg -f /etc/$BASENAME/frontend.cfg -f /etc/$BASENAME/backend.cfg -p /var/run/$BASENAME.pid
   RETVAL=$?
   echo
   [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$BASENAME
@@ -81,7 +83,9 @@
 }

 check() {
-  /usr/sbin/$BASENAME -c -q -V -f /etc/$BASENAME/$BASENAME.cfg
+  /usr/sbin/$BASENAME -c -q -V -f /etc/$BASENAME/$BASENAME.cfg 
+                            -f /etc/$BASENAME/frontend.cfg 
+                            -f /etc/$BASENAME/backend.cfg
 }

 rhstatus() {

上記の修正を施したスクリプトで起動すると分割したファイルを読み込んで起動してくれます。

最後に

  • いい感じです

補足

Apache 等のように include *.cfg とかして複数の設定ファイルを読み込めないのかという議論が以前から行われていたようです。

パッチもあたったりしていますが、include オプションは利用出来ないようなので取り込まれなかったようです…。

HA Proxy の状態監視と認証機能

HA Proxy には stats enable と指定することでレポーティング機能が有効になります。

frontend test-cluster1
        bind 0.0.0.0:80
        mode http
        timeout client 1s
        default_backend application-backend
        option forwardfor
        option  httplog clf
        log global
        stats enable
        stats hide-version
        stats scope   .
        stats uri     /admin?stats

以下のように frontend ディレクティブに関するセッション情報等がブラウザで確認出来ます。

20140728_001_haproxy_status

さらに設定に以下を追加すると上記のページに対して認証をかけることが出来ます。

stats realm   Haproxy Statistics
stats auth    admin_example:password_example

認証情報を設定ファイルに直接記載するのはちょっち頂けませんが簡単ですね。

さいごに一言

  • HA Proxy 設定ファイル大杉

元記事はこちらです。