harumaki.net

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

haproxyを試す 2.syslog設定

   


※haproxy RPM版です。

haproxyのログをrsyslogへ出力する場合の設定方法。
ログの書き出しはsyslogファシリティを利用するが、送信方法はrsyslogの環境に応じた、下記の2通り。

  1. UDPで送る(syslogファシリティ)
    haproxyのログ出力の設定は、デフォルトでsyslog/rsyslog側でUDP514番ポートを有効にし、そこへhaproxyのログを投げるように書かれている。
    ログをローカル以外に送信したい場合、ローカルも含めて複数のホストに残したい場合はこちら。
  2. rsyslog側でソケットを用意してあげる場合
    rsyslog側でソケットとフィルタリングルールを設定し、haproxy側でソケットを指定してログを送信する。
    ロードバランサーのローカル内にログをすべて落とす場合はこちらでオッケー。

1)UDPで送る場合(syslogファシリティ使用)

haproxyはデフォルトでsyslogファシリティを使う指定が有効になっているので、rsyslog側を合わせればすぐ使用可能。

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

How to enable logging of haproxy in rsyslog
HAProxy: Give me some logs on CentOS 6.5!
HAProxy Logging
※地味にulimitの設定やmaxconnの設定も参考になる。
rsyslog&syslog

rsyslogd (syslogd) 設定

1-1. haproxy側の設定

こちらはhaproxy.cfg内にて以下の記述が有効になっていればOK。

    log         127.0.0.1 local2

デフォルトでsyslogファシリティの指定がlocal2で設定されている。
コメントアウトされていない場合は有効化。ファシリティはlocal2が埋まっている場合は変更してもOK。

1-2. rsyslog側の設定

1.UDP514番ポートでの待ち受けを有効に。

パターン1. /etc/rsyslog.confでの設定

	$ModLoad imudp
	$UDPServerRun 514
	$UDPServerAddress 127.0.0.1

こちらの場合は、UDPServerAddressで127.0.0.1を指定しているので、UDPでのログ受信は有効ながら、ローカルホストからの受信だけが有効。

パターン2. /etc/sysconfig/rsyslogで設定する場合(RedHat、CentOS)
上記のrsyslog.confの代わりにこちらで設定を行う場合。

		SYSLOGD_OPTIONS="-m 0 -r514"

ただし、こちらの場合は待ち受けIPが0.0.0.0になる、という違いがある。
LAN内の各ホストからsyslogを受け付けるサーバーであれば問題なし。

上記設定後、netstatで確認すると”0.0.0.0″で待ち受けされている。

udp        0      0 0.0.0.0:514                 0.0.0.0:*

2.syslogファシリティをhaproxyのログ出力用に指定。

haproxy.cfgでデフォルト指定されているlocal2を使用。haproxy.cfg側でファシリティを変更した場合はそちらに合わせる。

local2.*         /var/log/haproxy.log

3./var/log/messagesへの出力を抑制

syslogファシリティを設定した場合、そのままだと/var/log/messagesにも出力されるので二重にログが出力されてしまう状況に。
ファシリティの番号を指定して、出力を抑制する設定を追加。
具体的には指定したログファシリティに”.none”をつければOK。

– 変更前

	*.info;mail.none;authpriv.none;cron.none       /var/log/messages

– 変更後

	*.info;mail.none;authpriv.none;cron.none;local2.none    /var/log/messages

1-3. 設定適用

syslogファシリティ設定後、rsyslogd、haproxyの順番で再起動し、ログ出力を確認。

1. rsyslogd再起動

	# /etc/init.d/rsyslog restart
	Shutting down system logger:                       [  OK  ]
	Starting system logger:                            [  OK  ]
	#

2. ポート確認

UDP514番でのポート起動を確認。

	# netstat -ln | grep 514
	udp        0      0 127.0.0.1:514               0.0.0.0:*

3. haproxy再起動

	# /etc/init.d/haproxy restart
	Stopping haproxy:                                  [  OK  ]
	Starting haproxy:                                  [  OK  ]
	
	Message from syslogd@localhost at Apr 27 12:32:49 ...

4. ログ確認

ちょっと古いけど、04/27の作業ログです。

	Apr 27 12:32:49 localhost haproxy[1579]: Proxy main started.
	Apr 27 12:32:49 localhost haproxy[1579]: Proxy static started.
	Apr 27 12:32:49 localhost haproxy[1579]: Proxy app started.

出力されました。

2)syslogのソケットを使ってログを送る場合

上記1のsyslogファシリティでの設定と異なり、rsyslog.conf側でソケットを指定し、haproxy側が合わせるので
先にrsyslog.confを設定し、有効化しておくと良い。

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

haproxy logging to syslog
RSYSLOG Doc: Filter Conditions
rsyslog  特定のログに対するフィルタ
rsyslogを設定する

2-1. haproxy側設定

rsyslogで使用するソケットは、/var/lib/haproxy/以下にてディレクトリとソケットファイルを指定し、そこにhaproxyがログを送る形となる。
順番が逆になるけど、まずhaproxy.cfg空設定を。

ソケットのパス: /var/lib/haproxy/dev/log

haproxyに記述する際は、/var/lib/haproxyを省略した形で記述。

	log /dev/log    local0

rsyslog.conf側でフィルタを設定しているので、syslogファシリティは使う必要が無いのでlocal0でOK。

2-2. rsyslog側設定

1. AddUnixListenSocketにて、待ち受けソケットを指定する。

rsyslog.conf内に”$ActionFileDefaultTemplate”で”RSYSLOG_TraditionalFileFormat”の設定があれば
その下に記載すると、syslogのフォーマットがデフォルトになる

以下では、/var/lib/haproxy以下にソケット用ディレクトリ”dev”をmkdirし、ソケット”log”を設定。

		$AddUnixListenSocket /var/lib/haproxy/dev/log

※/var/lib/haproxy以下に直接ソケットを指定すると、haproxy側の設定でエラーが出るのでディレクトリを1段下に指定する。
※ソケットの出力先ディレクトリはhaproxyユーザーのホームディレクトリからの相対パスとなる。

2. ログのフィルタリング

ログ内の”haproxy”エントリは/var/log/haproxy.logに出力。

プロパティベースでの書式例

		:programname, startswith, "haproxy" /var/log/haproxy.log
		&~

if文の条件式ベースの場合(こちらのほうが柔軟にできるかも?)

		if $programname startswith 'haproxy' then /var/log/haproxy.log
		&~

→設定後、rsyslogd再起動(reloadではダメ、再起動をすること)。

2-3. 設定適用

こちらもsyslogファシリティ設定時と同様、rsyslogd、haproxyの順番で再起動し、ログ出力を確認。

1. rsyslogd再起動

	# /etc/init.d/rsyslog restart
	Shutting down system logger:                       [  OK  ]
	Starting system logger:                            [  OK  ]
	#

3. haproxy再起動

	# /etc/init.d/haproxy restart
	Stopping haproxy:                                  [  OK  ]
	Starting haproxy:                                  [  OK  ]

参考:ログ出力の抜粋

そのほか、haproxyで出力されるログの表示をサンプルとして記載。

バックエンドサーバー起動時のログ

バックエンドサーバーで指定したサービスが起動し、HAProxy側からアクティブとして認識された際のログ

Apr 27 12:36:21 localhost haproxy[1580]: Server static/dev-web02 is UP, reason: Layer4 check passed, check duration: 0ms. 1 active and 0 backup servers online. 0 sessions requeued, 0 total in queue.

サーバー停止時のログ

今度はバックエンドサーバーでサービスが停止し、HAProxy側からステータスDOWNとして認識された際のログ。
そのままバックエンドサーバーから除外され、リクエストは転送されなくなる。

Apr 27 12:37:01 localhost haproxy[1580]: Server static/dev-web02 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.

さらに、バックエンドサーバーが1台もいなくなった時の警告ログ
これは、バックエンドを構成しているサーバーの最後の1ホストが応答しなくなった時の通知。

Message from syslogd@localhost at Apr 27 12:37:01 ...
 haproxy[1580]: backend static has no server available!
Apr 27 12:37:01 localhost haproxy[1580]: backend static has no server available!

ちなみに、バックエンド側にもログが飛ばされてくる。

	Message from syslogd@localhost at Apr 27 12:37:01 ...
	 haproxy[1580]: backend static has no server available!

クライアントアクセス時のログ

これはサービスインした状態でのHAProxyへのアクセスログ。どのバックエンドサーバーへ転送されたかも出力される。

haproxy.log

	
	Apr 27 12:40:00 localhost haproxy[1580]: 198.51.100.216:51524 [27/Apr/2015:12:40:00.028] main static/dev-web02 963/0/1/2/966 200 296 - - ---- 3/3/0/1/0 0/0 "GET / HTTP/1.1"
	Apr 27 12:40:01 localhost haproxy[1580]: 198.51.100.216:51524 [27/Apr/2015:12:40:00.994] main static/dev-web02 313/0/0/2/315 404 467 - - ---- 3/3/0/0/0 0/0 "GET /favicon.ico HTTP/1.1"

バックエンドサーバーのaccess_log

	198.51.100.216 - - [27/Apr/2015:03:40:00 +0000] "GET / HTTP/1.1" 200 29 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.37 Safari/537.36"
	198.51.100.216 - - [27/Apr/2015:03:40:01 +0000] "GET /favicon.ico HTTP/1.1" 404 287 "http://203.0.113.128/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.37 Safari/537.36"

といったところで。

 - infra, Load Balancing, network, web , ,