harumaki.net

インフラ屋の覚書や、ラーメン食べある記とか。

haproxyを試す 1.インストールから簡易設定まで

   


haproxy コミュニティ版の設定、動作検証を。
先日のここからの流れで、クライアント先のWebサービスへ導入するための検証の一環です。
ざっとマニュアルを確認した限りでも、ラウンドロビンだけでなくcookieパーシステンス、tcp-request、ヘッダーチェック、コネクション数による振り分けなどなど、色々なオプションが選べるので、使い勝手は良さそうですね~。

参考:お世話になっております!

公式サイト
Ver1.5 マニュアル
haproxy blog

今回は使わないけど、追々SSLリバースプロキシもやるのでブクマ。
Use haproxy 1.5 to create an SSL reverse proxy

サーバーはロードバランサー用サーバー、バックエンドのWebサーバーともにamazon linuxを使用。RPMパッケージがあるのでそのまま入れてみる。
テストにあたってのIP割り当てとしては、以下のような設定で。

HAProxyサーバーのグローバルIP 203.0.113.128
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
      ロードバランシングの接続先サーバーに関する設定

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 203.0.113.128
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"

簡易的ではあるものの、ひとまず動作確認ができたので、設定完了といったところで。

 - infra, Load Balancing, network, web , ,