この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
大栗です。
動的名前解決ができるHAProxyを使いたくなったのですが、Amazon Linux 2017.03でもHAProxyが1.5.2であるためソースからビルドする必要があります。ソースからビルドすると管理が行いにくくなるので、ソースインストールを管理できるporgを使って管理してみます。基本的には標準リポジトリでインストールできるものを使いたいのですがリポジトリのバージョンが上がっていないので仕方がありません。。。
2017年10月5日:手動で作成したファイルの追加方法がわかったので追記しています。
porgとは?
以前はpacoという名前のプロジェクトでしたが、現在はporgとして開発が進められています。 ソースからビルドしたソフトウェアを管理できるツールです。
試してみる
以下の環境で試してみます。
- OS: Amazon Linux 2017.03
- インストール対象: HAProxy 1.6.12
インストール対象のHAProxyは1.6系の最新である1.6.12を使用します。HAProxyを普通にビルドする方法はこちらを参照して下さい。
porgのインストール
porgをビルドするためにgcc
とgcc-c++
をインストールします。
$ sudo yum install -y gcc gcc-c++
porgをダウンロードして展開します。
$ wget https://downloads.sourceforge.net/project/porg/porg-0.10.tar.gz
$ tar xf porg-0.10.tar.gz
$ cd porg-0.10
progをインストールします。そのままmakeするとGropというGUIツールも入るのですが、不要であるため--disable-grop
オプションを付けます。
$ ./configure --disable-grop
$ make
$ sudo make install
porg自身をporgの管理下に置きます。
$ sudo /usr/local/bin/porg -lp porg-0.10 make install
porgがporgに登録されていることを確認します。
$ porg -a
porg-0.10
HAProxyのインストール
HAProxyをダウンロードして展開します。ここでは1.6系の最新である1.6.12を使います。
$ cd ~
$ wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.12.tar.gz
$ tar xf haproxy-1.6.12.tar.gz
$ cd haproxy-1.6.12
$ make TARGET=generic
$ sudo /usr/local/bin/porg -lp haproxy-1.6.12 "make install"
porgの管理下にあることを確認します。
$ porg -a
haproxy-1.6.12
porg-0.10
$ porg -f haproxy-1.6.12
haproxy-1.6.12:
/home/ec2-user/haproxy-1.6.12/.build_opts
/usr/local/doc/haproxy/architecture.txt
/usr/local/doc/haproxy/close-options.txt
/usr/local/doc/haproxy/configuration.txt
/usr/local/doc/haproxy/cookie-options.txt
/usr/local/doc/haproxy/intro.txt
/usr/local/doc/haproxy/linux-syn-cookies.txt
/usr/local/doc/haproxy/lua.txt
/usr/local/doc/haproxy/management.txt
/usr/local/doc/haproxy/network-namespaces.txt
/usr/local/doc/haproxy/proxy-protocol.txt
/usr/local/sbin/haproxy
/usr/local/share/man/man1/haproxy.1
HAProxyを動かす
HAProxyの設定を行います。(追加したファイルをporgの管理下に置くための手順に変更しています。)
$ sudo mkdir /var/lib/haproxy
$ sudo mkdir /usr/share/haproxy
$ sudo /usr/local/bin/porg -+lp haproxy-1.6.12 "install -o root -g root -m 0644 -D examples/option-http_proxy.cfg /etc/haproxy/haproxy.cfg"
$ sudo /usr/local/bin/porg -+lp haproxy-1.6.12 "install -o root -g root -m 0755 /usr/local/sbin/haproxy /usr/sbin/haproxy"
$ sudo /usr/local/bin/porg -+lp haproxy-1.6.12 "install -o root -g root -m 0755 examples/haproxy.init /etc/init.d/haproxy"
$ sudo /usr/local/bin/porg -+lp haproxy-1.6.12 "cp examples/errorfiles/* /usr/share/haproxy/"
以下は旧手順になります。
$ sudo mkdir /var/lib/haproxy
$ sudo mkdir /etc/haproxy
$ sudo mkdir /usr/share/haproxy
$ sudo cp /usr/local/sbin/haproxy /usr/sbin/
$ sudo cp examples/haproxy.init /etc/init.d/haproxy
$ sudo cp examples/errorfiles/* /usr/share/haproxy
$ sudo chmod +x /etc/init.d/haproxy
HAProxyを実行するユーザを作成します。まずはデフォルトの定義を確認します。
$ cat /usr/share/doc/setup-2.8.14/uidgid | grep haproxy
haproxy 188 188 /var/lib/haproxy /sbin/nologin haproxy
haproxyユーザを作成します。
$ sudo groupadd -g 188 haproxy
$ sudo useradd -u 188 -g haproxy -d /var/lib/haproxy -s /sbin/nologin haproxy
サービスの登録をします。
$ sudo chkconfig --add haproxy
$ sudo chkconfig haproxy on
設定ファイルを作成します。サンプルとして5000番ポートをローカルの80番ポートに繋げる設定をしました。
$ sudo vim /etc/haproxy/haproxy.cfg
/etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend main
bind 127.0.0.1:5000
default_backend back
backend back
balance roundrobin
server static 127.0.0.1:80 check
テスト用にapacheもインストールします。
$ sudo yum install -y httpd
普通にhttpでアクセスすると以下のようになります。
$ curl http://127.0.0.1/
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Test Page for the Apache HTTP Server on Amazon Linux AMI</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
・
・
・
略
今度はHAProxyで設定した5000番ポートでアクセスします。先ほどと同じレスポンスが返ってきます。
$ curl http://127.0.0.1:5000/
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Test Page for the Apache HTTP Server on Amazon Linux AMI</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
・
・
・
略
HAProxyを削除する
最後にHAProxyを削除します。
まずは、サービスを停止します。
$ sudo service haproxy stop
Shutting down haproxy: [ OK ]
$ sudo service httpd stop
Stopping httpd: [ OK ]
-r
オプションにパッケージ名を指定して削除します。
$ sudo /usr/local/bin/porg -b -r haproxy-1.6.12
$ porg -a
porg-0.10
HAProxyのファイルが消えています。
$ sudo ls -al /usr/local/doc/haproxy
ls: cannot access /usr/local/doc/haproxy: No such file or directory
ただし手動で作成したファイルはporgの管理外なので別途削除します。手動で作成したファイルも一緒にporgで管理する方法を知っている方がいたら教えてください。。。以下のオプションで追加できるようでした。
$porg -lp+ haproxy-1.6.12 "COMMAND"
$ sudo chkconfig --del haproxy
$ sudo userdel haproxy
$ sudo rm -f /usr/sbin/haproxy # 新手順では不要です
$ sudo rm -f /etc/init.d/haproxy # 新手順では不要です
$ sudo rm -rf /usr/share/haproxy # 新手順では不要です
さいごに
私は基本的にはディストリビューションのリポジトリにあるパッケージを使用すべきだと考えていますが、バージョンが古いなどといった問題などでパッケージをソースからビルドする必要に迫られる場合があります。しかしインストールしたパッケージに脆弱性が発見されて入れ替えを行う必要が出てくる事があります。パッケージ管理をしていないと入れ替えを行えなくなるため、ソースからビルドする場合は何らかのパッケージ管理ツールを使用しましょう。