Debian に HAProxy をインストール

HAProxy はロードバランサで、複数の Web サーバに処理を振り分けるために使われたりするもの。
このマシンで Web サーバとして使い始めた nginx も同じ用途で使えるので、通常あれば HAProxy を入れなくても大体同じことができる。

が、密かに企んでいる将来の目的にはどうも nginx が使えないらしい。目的の詳細についてはまた別な記事で語ることにして、今回は取りあえず HAProxy を経由して nginx に接続させるところまでやってみる。
apt-get install haproxy
インストールができたら、/etc/default/haproxy の ENABLED を 1 に変更する。
vim /etc/default/haproxy
#ENABLED=0
ENABLED=1
更に haproxy の設定ファイルを書き換える。
最初の時点でなんかわりと色々と書いてあるのだが、今回は真面目にロードバランサとして使うわけではないので取りあえずファイルをバックアップしつつ全面的に書きなおす方向で進める。
cd /etc/haproxy
cp haproxy.cfg haproxy.cfg.default
vim haproxy.cfg
global
  user  haproxy
  group haproxy
  daemon

defaults
  mode    http
  retries 3
  option  redispatch
  option  forwardfor except 127.0.0.1/8
  option  SERVERID rewrite

backend web
  timeout client  30s
  timeout server  30s
  timeout connect 1s
  balance roundrobin
  server  web1 127.0.0.1:60080
  rspirep ^(Location:\ [a-z]+://[-.a-z0-9]+)(:[0-9]+)(.*)$ \1\3

frontend all 0.0.0.0:80
  default_backend web
※2010-12-01 追記 - Locationヘッダの書き換えを追加

HAProxy がポート 80 番を使いたいので、nginx 側を 60080 に切り替えることにした。
/usr/local/nginx/nginx.conf も編集する。
vim /usr/local/nginx/nginx.conf
#        listen       80;
        listen       127.0.0.1:60080;
現在は nginx が動作中、haproxy は停止中なのでそれぞれ reload, start させる。
invoke-rc.d nginx reload && invoke-rc.d haproxy start
ブラウザからアクセスしてみると上手くいっているようなので、haproxy を daemontools 経由で起動させるようにする。
update-rc.d -f haproxy remove
cd /etc/service
mkdir haproxy
cd haproxy
vim run
#!/bin/sh
exec 2>&1
exec /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -db -q -p /var/run/haproxy.pid
停止して改めて起動させてみる。
chmod 700 run
invoke-rc.d haproxy stop && svc -u /etc/service/haproxy
立ち上がっているようなので成功した模様。確認のために一応 netstat -lnp もしておく。
netstat -lnp
タイムアウトの時間の設定の適切なところがよくわからんのでその辺は状況次第で考えないとダメそうかなあ。

今後は nginx には HAProxy が接続しにいくようになるので、当然ながら REMOTE_ADDR を参照しようとすると必ず 127.0.0.1 になってしまう。
この辺は恐らく /usr/local/nginx/fastcgi.conf を編集すれば REMOTE_ADDR を HTTP_X_FORWARDED_FOR の値に書き換えることもできそうな気配だけど、取りあえず保留にしておく。

2010-12-01 追記 --- 現時点で把握している問題点

  • pid ファイルが作成されない
    どうやら HAProxy は daemon 起動でなければ pid ファイルを作成しないらしい。
    普段は困ることはないものの、invoke-rc.d haproxy reload などが使えない。
    この辺見直した方がよさそうだ。