デスマーチがやっと終わったので久しぶりの更新です。
今回の作業中に HAProxy のちょっと便利なというか、思いつきを試してみたのでメモを残しておきたいと思います。
目次
スポンサーリンク
マルチドメインを処理する設定 (改)
下記の記事でマルチドメインを HAProxy で処理するにはという事を書きましたがこれの改良版 (手抜き版) です。
例えば、100 ドメイン名を HAProxy に設定する必要が出た場合、1 ドメイン名毎に設定なんて書きたくないですよね。多分、1 つ位は間違えそうだし。
下記の例はそういう場合にオススメの設定です。
global log 127.0.0.1 local6 notice maxconn 200000 daemon nbproc 1 defaults log 127.0.0.1 local6 info retries 0 timeout client 300s timeout connect 300s timeout server 300s log global # # frontend server # frontend proxy_http:80 bind :80 mode http maxconn 100000 acl is_srv1 dst 192.168.0.1 acl is_srv2 dst 192.168.0.2 acl is_srv3 dst 192.168.0.3 use_backend srv1_http if is_srv1 use_backend srv2_http if is_srv2 use_backend srv3_http if is_srv3 # # backend server # backend srv1_http mode http server srv1.example.jp 192.168.1.1 backend srv2_http mode http server srv2.example.jp 192.168.1.2 backend srv3_http mode http server srv3.example.jp 192.168.1.3
前回は「hdr_dom(host)」でリクエストされたドメイン名を見て振り分けを行っていましたが、今回は「dst」を使って宛先の ip アドレスを見てって感じになります。
Listen Port 80 は any 見たいな感じで受けるようにして、後は lb に ip アドレスを alias してやると OK です。
例えば、「www1.example.jp – www99.example.jp = 192.168.0.2」 だとしたら HAProxy が 192.168.1.2 に渡すって感じになるので、上記のようなシンプルな設定で書けて非常に便利です。
ネックとしては、一体今どのドメイン名を中継しているのかが良くわからない (正確には探すのが面倒くさい) のと、多分 dst の判定って名前解決してるかもなので、アクセスが激しすぎる場合はキツいかもという事です。
backend も 「server srv1.example.jp srv1.example.jp」という感じに FQDN が指定できますが、都度、名前解決を行うせいか激しくレスポンスが悪化しました。(すぐ戻しちゃいましたがもしかしたら他の原因も)
ちなみに HAProxy のモニタリングも表示したい場合にはこんな設定をさっきの設定に追加してやるといいです。
# # frontend server # frontend proxy_http:80 bind :80 mode http maxconn 100000 ## frontend に以下 2 行追加 acl is_lb hdr_dom(host) -i lb.example.jp use_backend lb_http if is_lb # # Monitoring # backend lb_http mode http server lb.example.jp 127.0.0.1 stats enable stats show-legends stats uri /hastats stats auth haadmin:hapass
後は lb の FQDN を適当な ip に紐付けちゃえば OK です。ip が豊富にあるなら lb 用の ip を持たせて dst でもいいです。
HAProxy の ACL って便利です。
HAProxy (lb) の Default Gateway を無停止で切り替える
HAProxy というより OS の話になりますが、割りと使えるなという感じなので合わせて書きます。
通常は稼働しているサーバの「GW」や「物理 ip」を変更するって滅多にしないと思うのですが、lb でこのリスキーな事を急遽やる必要が出たのでやってみました。
稼働中の物理 IP を付け替える
Linux だと ifcfg-eth0 とかに変更後の ip を記述して ifdown eth0 -> ifup eth0 で nic 単位のリロードをかけれるのですが、FreeBSD にはこの便利なコマンドがないのでこんな感じにやります。
ifconfig em2 192.168.1.2 netmask 255.255.255.0 up
リナンバをしたい場合もこのコマンド一発でいけるので便利です。(Linux でもいけるはず)
当たり前ですが SSH で繋いで作業する場合は接続する nic を変更しておかないと切れます。
稼働中の GW 変更する
次に gw の変更ですが、FreeBSD の場合は rc.conf の gw を書き換えて以下を実行すると簡単にできます。
#/etc/rc.d/routing restart
ping を打ちながらのやってみましたが断はほぼ無しでいけました。
route コマンドで同様の操作を行う場合は、「route del -> route add」とする必要があり del した瞬間に ssh も切れるはず。
なので以下のようにやれば多分切れないんじゃないかと思います。(未検証)
route del 0.0.0.0 192.168.1.254 ; route add 0.0.0.0 192.168.2.254
ま、こんなリスクの高い事をやるくらいなら、最初から tag vlan を使うように lb を構成しておけってことですね。
使用頻度はかなり低いですが結構使えるので忘れないようにしようと思います。
他にもまだあった気がしますが思い出したらまた書きます。