新しいホスティングに移動するにあたって、せっかくなので HTTP サービスを整理してみた。その時に HAProxy をフロントの Proxy に使ってみたのでメモ。
環境は以下のとおり
公開しているサービスは色々あり、これを整理したかった。
これを一台でやってるので、 haproxy は別にロードバランサー的な役割は特にしていない。ただのプロキシ、兼SSL。
特別な理由もないので、パッケージでインストール。
$ sudo apt-get install haproxy
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 ...
複数のポートで待機して、それ毎にバックエンドのサービスを選択する場合、 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 などもある。