OSS の L7 ロードバランサ HAProxy でマルチドメインを処理する設定のメモ書きです。
HAProxy は Linux, FreeBSD 等で動作する高機能なロードバランサソフトウェアで、負荷分散が必要な Web コンテンツに対してスケールアウト目的で使うのが一般的だと思います。
他にはハイアベイラビリティを目的としたホットスタンバイの追加だったり、万が一に備え sorry サーバの追加という事もできます。
今回はマルチドメインな環境下に sorry サーバを追加したいと思ったので検証してみました。
スポンサーリンク
HAproxyの基本的な設定
まずは前置きとして HAproxy の基本的な設定についてです。
Web コンテンツを複数のサーバで分散したい場合、一般的 (と思っている) な HAProxy の設定は以下のような感じです。
listen example.com:80 bind 192.168.0.254:80 mode http balance static-rr maxconn 1024 timeout connect 20s timeout server 20s timeout check 5s option httplog option httpchk GET /index.html HTTP/1.0 server www1 192.168.0.1:80 check inter 5000 fall 2 server www2 192.168.0.2:80 check inter 5000 fall 2
上記は example.com への HTTP リクエストを www1 – www2 にラウンドロビンで振り分けるという設定内容です。
これに sorry サーバを追加したい場合は以下のようになります。
server www1 192.168.0.1:80 check inter 5000 fall 2 server www2 192.168.0.2:80 check inter 5000 fall 2 server sorry 192.168.0.100:80 backup
www1 – www2 のサーバに対して行なっているヘルスチェックが落ちると、sorry に HTTP リクエストが振り分けられます。
ドメイン名毎に専用のサーバが当てられる場合は同じ要領で設定を追加していけば良いですが、これがマルチドメインの場合だとちょっと問題がでてきます。
同じ要領でマルチドメインを設定した場合こんな感じになります。
listen example.com:80 bind 192.168.0.254:80 mode http ~ 省略 ~ server www1 192.168.0.1:80 check inter 5000 fall 2 server www2 192.168.0.2:80 check inter 5000 fall 2 server sorry 192.168.0.100:80 backup listen hoge.jp:80 bind 192.168.0.253:80 mode http ~ 省略 ~ server www1 192.168.0.1:80 check inter 5000 fall 2 server www2 192.168.0.2:80 check inter 5000 fall 2 server sorry 192.168.0.100:80 backup
これでは同じサーバに対してヘルスチェックが重複して行われるのでイマイチです。
あと、HTTP しか使わないのであれば VIP を新規に振る必要もほとんどないと思いますし。
実際にはヘルスチェックがちょっと重複してるくらいでは影響があまりないですが、無駄であることは確かですし余計なものは削りたいものです。
そこで海外のフォーラム何かを調べてたどり着いたのが下記方法です。
HAProxyのマルチドメイン設定
まずは設定から。
frontend multiple_domains bind 192.168.0.254:80 mode http maxconn 1024 timeout client 10s acl is_v1 hdr_dom(host) -i example.com acl is_v1 hdr_dom(host) -i hoge.jp acl is_v2 hdr_dom(host) -i drive.ne.jp acl is_dev hdr_dom(host) -i dev.drive.ne.jp use_backend virtual_www1 if is_v1 use_backend virtual_www2 if is_v2 or is_dev default_backend default_www backend default_www mode http balance static-rr timeout connect 20s timeout server 20s timeout check 5s option httplog option httpchk GET /check.html HTTP/1.0 server default_www 192.168.0.50:80 check inter 5000 fall 2 backend virtual_www1 mode http balance static-rr timeout connect 20s timeout server 20s timeout check 5s option httplog option httpchk GET /check.html HTTP/1.0 server www1 192.168.0.1:80 check inter 5000 fall 2 server www2 192.168.0.2:80 check inter 5000 fall 2 server sorry 192.168.0.100:80 backup backend virtual_www2 mode http balance static-rr timeout connect 20s timeout server 20s timeout check 5s option httplog option httpchk GET /check.html HTTP/1.0 server www3 192.168.0.3:80 check inter 5000 fall 2 server www4 192.168.0.4:80 check inter 5000 fall 2 server sorry 192.168.0.100:80 backup
設定内容は frontend の部分で HTTP ヘッダからドメイン名を判定して、紐づく backend に送るという感じです。
どれにもマッチしなければ default_www で定義したサーバに HTTP リクエストを振ります。
これならヘルスチェックも重複しないし、無駄な VIP も振らなくて済みます。
sorry サーバ自体にヘルスチェックをかけていないのは、当たり前ですが sorry サーバは死んじゃ駄目だろうという事です。かけてもあまり意味が無いと思ってます。
以上簡単ですが HAProxy でマルチドメインを処理する方法は以上です。