work.log

元エンジニアの備忘録的ブログ

HAProxyでマルチドメインを処理する

投稿:2013-05-29 19:45  更新:

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 リクエストが振り分けられます。

この例では各サーバを個別に建てていますが、それほどアクセスがないコンテンツを冗長目的のために分散する場合は sorry サーバを HAProxy に同居させても良いと思います。

ドメイン名毎に専用のサーバが当てられる場合は同じ要領で設定を追加していけば良いですが、これがマルチドメインの場合だとちょっと問題がでてきます。

同じ要領でマルチドメインを設定した場合こんな感じになります。

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 でマルチドメインを処理する方法は以上です。

おすすめのVPSサーバ

  • OSが選べる
  • VPS同士でLANが組める
  • 複数台構成向き

このブログで使っています。

  • 転送量が多いサービスに
  • 借りてるのは3年間一度もdown無し!

よく見られている記事

  • 本日
  • 週間
  • 月間