主に IT 技術を整理するためにメモ的に書き溜めています。少しだけフリーソフトもあるよ。コメントを残すには、 facebook を使ってください。

HAProxy の設定メモ

最終更新日 2014-10-26 01:46:27 (1年以上前の記事です)

新しいホスティングに移動するにあたって、せっかくなので HTTP サービスを整理してみた。その時に HAProxy をフロントの Proxy に使ってみたのでメモ。

環境は以下のとおり

  • Ubuntu 14.04.1 LTS

公開しているサービスは色々あり、これを整理したかった。

  • PHP で動いているこのブログ
  • Ruby on Rails のホームページ(Unicorn+Nginx 構成)
  • Ruby on Rails のテスト環境(Unicorn+Nginx 構成)
  • https 上の ownCloud(php)
  • https 上の SVN(apache)
  • その他 Apache で捌いているバーチャルドメイン

これを一台でやってるので、 haproxy は別にロードバランサー的な役割は特にしていない。ただのプロキシ、兼SSL。

HAProxy のインストール

特別な理由もないので、パッケージでインストール。

$ sudo apt-get install haproxy

SSL 証明書の設定

HAProxy は SSL の証明書、チェーン証明書、秘密鍵などを1つのファイルにまとめる。例えば、以下の様な感じ

-----BEGIN CERTIFICATE-----
...
... certificate 1 ...
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
... certificate 2 ...
...
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
...
... private key ...
...
-----END PRIVATE KEY-----

これを適当な場所に保存。例えば /etc/ssl/private/certs-key.pem などに保存する。

そして、このファイルの場所を /etc/haproxy/haproxy.conf に指定して、https frontend の設定を作る。

global
...
        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private
...
frontend https-in
        bind :443 ssl crt certs-key.pem no-sslv3
...

Proxy の設定

ポート(SSLも)による振り分け

複数のポートで待機して、それ毎にバックエンドのサービスを選択する場合、 frontend セクションを設ければよい。例えば http(80) と https(443) で待機する場合

...
frontend http-in
        bind :80
...
frontend https-in
        bind :443 ssl crt certs-key.pem no-sslv3
...

ドメイン名による振り分け

ドメイン名に応じてバックエンドを振り分けるには hdr(host)、 hdr_beg(host) や hdr_end(host) を用いた acl を作る。hdr(host) の意味的には HTTP Header の Host という感じ(だと思う)。例えば

...
acl host_blog hdr(host) -i blog.enjoitech.com
...
use_backend apache if host_blog
...

と書けば、ホスト名が blog.enjoitech.com にマッチする host_blog という ACL を設定し、それがヒットしたら、 apache というバックエンドサービスに振り分けるということ。
バックエンドの設定としては、以下の様なものを追加する。

...
backend apache
        server apache 127.0.0.1:8080 cookie A check
...

8080 ポートに apache を走らせている場合。

パスによる振り分け

パスによる振り分けには、上記の hdr(host) の代わりに url を用いる。例えば

...
acl url_test url_beg /test
...

は、 URL のはじめが /test で始まっていたら場合にマッチする ACL。

また、先ほどの hdr(host) などと組み合わせて、複数の ACL にマッチした場合の条件を書きたい場合は以下の様に ACL を羅列するだけで良い。例えばドメインが blog.enjoitech.com でパスが /test で始まっていた場合、 nginx に振り分けるとすれば

...
use_backend nginx if host_blog url_test
...

リダイレクト

特にバックエンドサーバーに振り分けずに、そのままリダイレクトさせたい場合は、 redirect コマンドを用いる。単純に特定の URL へ飛ばしたい場合は

...
redirect location http://www.enjoitech.com if host_jp
...

もしくは、パスは同じものをキープして、ドメインだけを書き換えた場所にリダイレクトしたい場合は

...
redirect prefix http://blog.enjoitech.com code 301 if host_blog_jp
...

これだと、例えば http://blog.enjoitech.jp/article/1 を http://blog.enjoitech.com/article/1 に HTTP Response 301 でリダイレクトしてくれる。

これ以外にも、 http を https にリダイレクトさせる scheme などもある。

最終更新日 2014-10-26 01:46:27

コメント このエントリーをはてなブックマークに追加

フリーソフトウエア
EnjoiFLV
EnjoiPacket
EnjoiCrypto
ランキング
rank2, rank3, rank7, rank10, rank11
todo メモ
facebook 対応
ページ処理
RSS feed
検索機能
認証いる?
更新日表示
実はカテゴリ機能
多言語
実はユーザ機能
ソースその内公開
動作環境メモ
php-5.1.6 with PDO
SQLite-3.3
IE6
FireFox-1.5
RSS
非認証

検索
Google