Last Updated on 2021年7月4日 by かんりにん
haproxy コミュニティ版の設定、動作検証を。
先日のここからの流れで、クライアント先のWebサービスへ導入するための検証の一環です。
ざっとマニュアルを確認した限りでも、ラウンドロビンだけでなくcookieパーシステンス、tcp-request、ヘッダーチェック、コネクション数による振り分けなどなど、色々なオプションが選べるので、使い勝手は良さそうですね~。
参考:お世話になっております!
公式サイト
Ver1.5 マニュアル
haproxy blog
今回は使わないけど、追々SSLリバースプロキシもやるのでブクマ。
Use haproxy 1.5 to create an SSL reverse proxy
Contents
サーバーはロードバランサー用サーバー、バックエンドのWebサーバーともにamazon linuxを使用。RPMパッケージがあるのでそのまま入れてみる。
テストにあたってのIP割り当てとしては、以下のような設定で。
HAProxyサーバーのプライベートIP 172.16.1.254
HAProxy配下のWebサーバー 172.16.1.101~104
—
クライアント端末のグローバルIP 198.51.100.216
1)インストール
今回インストールされるバージョンはRPM版1.5.2。
# yum install haproxy …snip… Installed: haproxy.x86_64 0:1.5.2-2.5.amzn1 Complete! #
2)設定
設定ファイルは/etc/haproxyhaproxy.cfg。
以下で設定のフォーマット、設定例を順番に記載。
コンフィグファイルの設定フォーマット
Configuration Manualにて”Configuration file format”を見た感じではいくつかのセクションに分かれていて
大まかには以下の通り(だと思いますw)
- globalセクション
haproxyのメイン設定、globalなのでhaproxy全体の制御セクションかなと。 - proxies セクション
バランサーの設定。具体的には”proxies”というセクション名でなく、以下の4つのフォーマットがメインのセクションといえる。- defaults
バランサーの設定全般、下記のlisten、frontend、backendを包括した設定を行う。 - listen
こちらは以下のfrontend、backendの設定をまとめて行うことが可能。TCPのみの通信の場合はlistenでの設定が便利とのこと(公式ページより)
またlistenセクションでは、haproxyの統計情報を出力する”hastats”ページを設定する項目がある。
用途としてはロードバランシング設定、hastats用設定の2用途があるということ。 - frontend
クライアントからのコネクションを受け付けるソケットに関する設定。 - backend
ロードバランシングの接続先サーバーに関する設定
- defaults
hastatsを有効にして利用する場合、listenセクションのほかglobalセクションにも設定項目があります。
若干ややこしいので、後日別エントリにて取りまとめます!
設定のドラフト
公式サイトのexampleをもとに。
1.global
haproxyのメイン設定
global # to have these messages end up in /var/log/haproxy.log you will # need to: # # 1) configure syslog to accept network log events. This is done # by adding the '-r' option to the SYSLOGD_OPTIONS in # /etc/sysconfig/syslog # # 2) configure local2 events to go to the /var/log/haproxy.log # file. A line like the following can be added to # /etc/sysconfig/syslog # # local2.* /var/log/haproxy.log # log 127.0.0.1 local2 ←デフォルトではsyslogファシリティのlocal2を指定。 この設定のまま行く場合は、上記に記載がある通り、rsyslog.confにも設定を追加する。 chroot /var/lib/haproxy ←ユーザー"haproxy"のchroot指定。デフォルトのままでOK。 pidfile /var/run/haproxy.pid ←haproxyデーモンのpidファイル指定。デフォルトのままでOK。 maxconn 4000 ←max connectionの指定値。運用を始めたら要調整だけど、ひとまずこのままで。 user haproxy ←実行ユーザーの指定。そのままでOK。 group haproxy ←実行グループの指定。そのままでOK。 daemon ←プロセスをバックグラウンドで起動する。デフォルトのままでOK。 # turn on stats unix socket stats socket /var/lib/haproxy/stats ←ソケットファイルの指定。統計情報に関連するが、そのままでOK。
2.proxy
まずdefaultセクションから。
defaults mode http ←モードの指定。 log global ←globalセクションのログ設定を継承。 option httplog option dontlognull option http-server-close 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
ホストの設定パターン1: frontend、backendをそれぞれ指定する場合
frontendセクション
コネクションを受け付けるソケット設定。
frontend main bind 0.0.0.0:80 default_backend www.example.com
backendセクション
バックエンドサーバーの設定。負荷分散メソッドの指定やバックエンドサーバーの指定を行う。
メソッドはラウンドロビンはリーストコネクション、スタティックなどが選べるが、詳細は別エントリにて。
今回はleastconn(リーストコネクション)を指定。
backend www.example.com balance leastconn ←ロードバランシングメソッドの設定。今回はleastconnで。 server web01 172.16.1.101:80 check inter 2000 fall 2 server web02 172.16.1.102:80 check inter 2000 fall 2 server web03 172.16.1.103:80 check inter 2000 fall 2 server web04 172.16.1.104:80 check inter 2000 fall 2
ホストの設定2: listenセクションで設定する場合
frontend、backendを指定せず、直接Webサーバーを指定する場合。
listenセクション
listen http-in bind *:80 server web01 172.16.1.101:80 check inter 2000 fall 2 server web02 172.16.1.102:80 check inter 2000 fall 2 server web03 172.16.1.103:80 check inter 2000 fall 2 server web04 172.16.1.104:80 check inter 2000 fall 2
hastatの設定
listenセクションにて設定、ポートやURIパスを指定する
listen hastats *:8088 # statsページへの接続プロトコル。下記ではhttpを指定 mode http # ページへのコネクション数、タイムアウト指定。省略可。 maxconn 64 contimeout 5000 clitimeout 10000 srvtimeout 10000 # statsページの有効化 stats enable stats show-legends # statsページのパスを指定 stats uri /haproxy?hastats # statsページへのログインに使用するユーザー名、パスワードを記載 stats auth username:yourpassword
ログの設定(rsyslog側の設定)
説明にあったようにsyslogファシリティへ渡す感じで。
– /etc/rsyslog.conf 記述
local2.* /var/log/haproxy.log
設定したら/etc/init.d/rsyslog restartをして、/var/log/haproxy.logが作成されていることを確認する。
3)動作確認
上述したけど、一応ホストとIPの設定を。
HAProxyサーバーのプライベートIP 172.16.1.254
HAProxy配下のWebサーバー 172.16.1.101
—
クライアント端末のグローバルIP 198.51.100.216
プロセス起動
initスクリプトから起動
# /etc/init.d/haproxy start Starting haproxy: [ OK ]
– ポートを確認
# lsof -i:80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME haproxy 11612 haproxy 5u IPv4 216328 0t0 TCP *:http (LISTEN)
サイトからアクセスしてみる
http://203.0.113.128/index.html
表示OK。 しかし、webサーバー側のログのソースIPがロードバランサーのプライベートIPになっているのでバックエンドのWebサーバー側にて修正が必要。
172.16.1.254 - - [24/Apr/2015:08:56:20 +0000] "GET /index.html HTTP/1.1" 200 29 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Ch rome/43.0.2357.37 Safari/537.36"
↑こんな感じ。
ということで、ソースIPを反映させるためmod_extract_forwardedか mod_rpafを入れることになるが、今回はhttpd-2.2系なので、mod_extract_forwardedを入れておく。
4)追加設定:mod_extract_forwardedのインストール
Amazon Linuxではデフォルトでepelが入っているので、そのままパッケージを入れることができる。
– インストール
# yum install --enablerepo=epel mod_extract_forwarded
– 設定
設定ファイル:/etc/httpd/conf.d/mod_extract_forwarded.conf
– 設定内容
25c25 < # MEFaccept 1.2.3.4 1.2.3.5 --- > MEFaccept all
– 設定を確認したら適用
# /etc/init.d/httpd configtest Syntax OK # /etc/init.d/httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ]
上記の追加を行い、再度アクセス。
ソースIPにクライアントのグローバルIPアドレスが適用されていることを確認。
198.51.100.216 - - [24/Apr/2015:08:59:57 +0000] "GET /index.html HTTP/1.1" 200 29 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrom e/43.0.2357.37 Safari/537.36"
簡易的ではあるものの、ひとまず動作確認ができたので、設定完了といったところで。