- 11/21 [PR]
- 09/04 fluentdを使ってzabbixでログ監視
- 07/20 CentOS6.3の罠
- 06/08 stunnelを使った通信経路の暗号化
- 05/11 systemdにjettyを登録する
- 04/20 fluentのRPMパッケージを作ろう
Title list of this page
うちの会社ではzabbixを使ってサーバの監視をしていますが、リソースの使用率のグラフ化やアラートの設定条件など、おおむねその機能に満足しています。しかし唯一不満な部分があります。それは、ログ監視。
たとえばTomcatのCatalina.logを監視していて、OutOfMemoryが出力されたらアラートを上げるように設定すると、出力行数だけ障害メールが飛んできて、さらにすぐさまリカバリーが来るという、なんともいただけない仕様なのです。
ひどいときは、それで200通以上のメールが携帯に届くこともあります。
最近fluentdを導入したこともあり、ログの集計結果を監視に利用できないかと考えたら、意外とすんなりできたのでご紹介します。
【監視対象サーバに必要なもの】
fluentd
fluent-plugin-zabbix
fluent-plugin-datacounter
fluent-plugin-forest
(1)監視対象サーバに必要なものをインストール
(2)fluentd.confに以下の設定をする。
以下の設定では、/opt/tomcat7/logs/catalina.out にOutofMemoryErrorが出ていないか監視します。
これにより毎分、OutOfMemoryErrorが難行出力されているかカウントし、結果をzabbixサーバに送るようになります。
【fluentd.conf】
<source>
type tail
path /opt/tomcat7/logs/catalina.out
tag java.tomcat.hoge
format /^(?<message>.*)$/
rotate_wait 60
pos_file /var/lib/fluentd/catalina.out.pos
</source>
<match java.tomcat.**>
type forest
subtype datacounter
remove_prefix java.tomcat
<template>
count_key message
outcast_unmatched true
aggregate all
tag javalog.__TAG__
pattern1 oom ^.*OutOfMemoryError.*$
</template>
</match>
<match javalog.**>
type forest
subtype zabbix
remove_prefix javalog
<template>
zabbix_server zabbix01.fuga.com
host __TAG__
name_key_pattern .*_count
</template>
</match>
(3)zabbixサーバにホスト、キー、トリガーを追加
ホスト名 hoge
キー oom_count
トリガー {Template:oom_count.count(300,0,"gt")}>0
以上でほかの監視と同じように、ログ監視にいろいろなトリガー条件を使うことができるようになります。
また、ほかの文字列を監視したい場合は、pattern1 oom ^.*OutOfMemoryError.*$ の下に、同じようにpattern2を書いてあげて、zabbixサーバにキー、トリガーを追加すればOK。
ログ形式をパースしていないので、どんなログにも使えます。
また、上の設定ではfluent-plugin-forestを使ってますが、中継fluentdサーバを使わないのであればいりません。
中継サーバがある場合は、fluent-plugin-forestを使ったほうが断然設定が短くなります。
上の設定だと、<source>で定義しているタグ中にホスト名を入れているので、ほかのサーバで同じことをしたい場合に中継サーバの設定をいじらなくて済みます。
fluentdはまだ使い始めたばかりですが、今後もちょっと便利な使い方を見つけたら、書いていきます。
たとえばTomcatのCatalina.logを監視していて、OutOfMemoryが出力されたらアラートを上げるように設定すると、出力行数だけ障害メールが飛んできて、さらにすぐさまリカバリーが来るという、なんともいただけない仕様なのです。
ひどいときは、それで200通以上のメールが携帯に届くこともあります。
最近fluentdを導入したこともあり、ログの集計結果を監視に利用できないかと考えたら、意外とすんなりできたのでご紹介します。
【監視対象サーバに必要なもの】
fluentd
fluent-plugin-zabbix
fluent-plugin-datacounter
fluent-plugin-forest
(1)監視対象サーバに必要なものをインストール
(2)fluentd.confに以下の設定をする。
以下の設定では、/opt/tomcat7/logs/catalina.out にOutofMemoryErrorが出ていないか監視します。
これにより毎分、OutOfMemoryErrorが難行出力されているかカウントし、結果をzabbixサーバに送るようになります。
【fluentd.conf】
<source>
type tail
path /opt/tomcat7/logs/catalina.out
tag java.tomcat.hoge
format /^(?<message>.*)$/
rotate_wait 60
pos_file /var/lib/fluentd/catalina.out.pos
</source>
<match java.tomcat.**>
type forest
subtype datacounter
remove_prefix java.tomcat
<template>
count_key message
outcast_unmatched true
aggregate all
tag javalog.__TAG__
pattern1 oom ^.*OutOfMemoryError.*$
</template>
</match>
<match javalog.**>
type forest
subtype zabbix
remove_prefix javalog
<template>
zabbix_server zabbix01.fuga.com
host __TAG__
name_key_pattern .*_count
</template>
</match>
(3)zabbixサーバにホスト、キー、トリガーを追加
ホスト名 hoge
キー oom_count
トリガー {Template:oom_count.count(300,0,"gt")}>0
以上でほかの監視と同じように、ログ監視にいろいろなトリガー条件を使うことができるようになります。
また、ほかの文字列を監視したい場合は、pattern1 oom ^.*OutOfMemoryError.*$ の下に、同じようにpattern2を書いてあげて、zabbixサーバにキー、トリガーを追加すればOK。
ログ形式をパースしていないので、どんなログにも使えます。
また、上の設定ではfluent-plugin-forestを使ってますが、中継fluentdサーバを使わないのであればいりません。
中継サーバがある場合は、fluent-plugin-forestを使ったほうが断然設定が短くなります。
上の設定だと、<source>で定義しているタグ中にホスト名を入れているので、ほかのサーバで同じことをしたい場合に中継サーバの設定をいじらなくて済みます。
fluentdはまだ使い始めたばかりですが、今後もちょっと便利な使い方を見つけたら、書いていきます。
PR
CentOS6.3がでたので、さっそくインストールして使おうと思ったら、通信できない。
bonding+VLAN という環境で使ってるので、設定ミスかと色々悩んだ結果、バグでした。
カーネル: 2.6.32-279.el6.x86_64
http://bugs.centos.org/view.php?id=5816
カーネルパニックに出会って、まわりに言ったらあっさりこんな情報を送ってくれました。orz
ちなみに、以下の手順でパニックが発生しました。
(1) bondingインターフェースをダウン
# ifdown bond0
(2) bondingインターフェースをアップ
# ifup bond0
ここで、突然通信できるようになりました。
(3) ネットワークスクリプトの再起動
# /etc/init.d/network restart
パニック発生
general protection fault: 0000 [#1] SMP
last sysfs file: /sys/devices/virtual/net/bond0.31/broadcast
CPU 1
Modules linked in: bonding 8021q garp stp llc ipv6 dcdbas microcode serio_raw iTCO_wdt iTCO_vendor_support tg3 sg i3200_edac edac_core ext4 mbcac]
Pid: 27521, comm: pidof Not tainted 2.6.32-279.1.1.el6.x86_64 #1 Dell Inc. PowerEdge R200/0FW0G7
RIP: 0010:[<ffffffff8143cc83>] [<ffffffff8143cc83>] dev_gro_receive+0x33/0x290
RSP: 0018:ffff880028283cb0 EFLAGS: 00010282
RAX: 677568097665646f RBX: ffff880229176480 RCX: ffff880229176480
RDX: 0000000000000608 RSI: ffff880229176480 RDI: ffff880228c8a760
RBP: ffff880028283ce0 R08: ffff880228d83020 R09: 0000000000000000
R10: fffffffffffffff0 R11: 0000000000000040 R12: ffff880228c8a760
R13: ffff880229176480 R14: ffff8802291764b8 R15: 000000000000001f
FS: 00007eff3549a700(0000) GS:ffff880028280000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007eff354a1000 CR3: 00000002277f4000 CR4: 00000000000406e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Process pidof (pid: 27521, threadinfo ffff880229382000, task ffff880227e8eae0)
Stack:
ffff880028283cc0 000000000000001f ffff880228c8a760 ffff880229176480
<d> ffff880229176480 000000000000001f ffff880028283d00 ffffffff814d7af8
<d> ffff880028283d20 ffff880229176480 ffff880028283d30 ffffffff814d7d7a
Call Trace:
<IRQ>
[<ffffffff814d7af8>] vlan_gro_common+0x188/0x230
[<ffffffff814d7d7a>] vlan_gro_receive+0x7a/0xa0
[<ffffffffa0250172>] tg3_poll_work+0x612/0xe30 [tg3]
[<ffffffff8110dc28>] ? perf_event_task_tick+0xa8/0x2f0
[<ffffffffa025807b>] tg3_poll+0x7b/0x440 [tg3]
[<ffffffff8143f1a3>] net_rx_action+0x103/0x2f0
[<ffffffff81073ec1>] __do_softirq+0xc1/0x1e0
[<ffffffff810db810>] ? handle_IRQ_event+0x60/0x170
[<ffffffff81073f1f>] ? __do_softirq+0x11f/0x1e0
[<ffffffff8100c24c>] call_softirq+0x1c/0x30
[<ffffffff8100de85>] do_softirq+0x65/0xa0
[<ffffffff81073ca5>] irq_exit+0x85/0x90
[<ffffffff81505b05>] do_IRQ+0x75/0xf0
[<ffffffff8100ba53>] ret_from_intr+0x0/0x11
<EOI>
[<ffffffff8112afc8>] ? release_pages+0x48/0x250
[<ffffffff811403a9>] ? get_user_pages+0x49/0x50
[<ffffffff8150327e>] ? do_page_fault+0x3e/0xa0
[<ffffffff8116b680>] ? mem_cgroup_get_reclaim_stat_from_page+0x20/0x70
[<ffffffff8112b517>] ____pagevec_lru_add+0x167/0x180
[<ffffffff8112b69b>] lru_add_drain+0x9b/0xa0
[<ffffffff811448ee>] unmap_region+0x4e/0x130
[<ffffffff81144ff6>] do_munmap+0x2b6/0x3a0
[<ffffffff81145136>] sys_munmap+0x56/0x80
[<ffffffff8100b0f2>] system_call_fastpath+0x16/0x1b
Code: 48 89 5d d8 4c 89 65 e0 4c 89 6d e8 4c 89 75 f0 4c 89 7d f8 0f 1f 44 00 00 48 8b 46 20 0f b7 56 7e 49 89 fc 48 89 f3 4c 8d 76 38 <f6> 40 71
RIP [<ffffffff8143cc83>] dev_gro_receive+0x33/0x290
RSP <ffff880028283cb0>
BUG: scheduling while atomic: swapper/0/0x10000100
---[ end trace fc3a501a071deef7 ]---
Kernel panic - not syncing: Fatal exception in interrupt
Pid: 27521, comm: pidof Tainted: G D --------------- 2.6.32-279.1.1.el6.x86_64 #1
Call Trace:
<IRQ> [<ffffffff814fd12a>] ? panic+0xa0/0x168
[<ffffffff815012d2>] ? oops_end+0xf2/0x100
[<ffffffff8100f26b>] ? die+0x5b/0x90
[<ffffffff81500e32>] ? do_general_protection+0x152/0x160
[<ffffffff8142fb82>] ? kfree_skb+0x42/0x90
[<ffffffff81500605>] ? general_protection+0x25/0x30
[<ffffffff8143cc83>] ? dev_gro_receive+0x33/0x290
[<ffffffff814d7af8>] ? vlan_gro_common+0x188/0x230
[<ffffffff814d7d7a>] ? vlan_gro_receive+0x7a/0xa0
[<ffffffffa0250172>] ? tg3_poll_work+0x612/0xe30 [tg3]
[<ffffffff8110dc28>] ? perf_event_task_tick+0xa8/0x2f0
[<ffffffffa025807b>] ? tg3_poll+0x7b/0x440 [tg3]
[<ffffffff8143f1a3>] ? net_rx_action+0x103/0x2f0
[<ffffffff81073ec1>] ? __do_softirq+0xc1/0x1e0
[<ffffffff810db810>] ? handle_IRQ_event+0x60/0x170
[<ffffffff81073f1f>] ? __do_softirq+0x11f/0x1e0
[<ffffffff8100c24c>] ? call_softirq+0x1c/0x30
[<ffffffff8100de85>] ? do_softirq+0x65/0xa0
[<ffffffff81073ca5>] ? irq_exit+0x85/0x90
[<ffffffff81505b05>] ? do_IRQ+0x75/0xf0
[<ffffffff8100ba53>] ? ret_from_intr+0x0/0x11
<EOI> [<ffffffff8112afc8>] ? release_pages+0x48/0x250
[<ffffffff811403a9>] ? get_user_pages+0x49/0x50
[<ffffffff8150327e>] ? do_page_fault+0x3e/0xa0
[<ffffffff8116b680>] ? mem_cgroup_get_reclaim_stat_from_page+0x20/0x70
[<ffffffff8112b517>] ? ____pagevec_lru_add+0x167/0x180
[<ffffffff8112b69b>] ? lru_add_drain+0x9b/0xa0
[<ffffffff811448ee>] ? unmap_region+0x4e/0x130
[<ffffffff81144ff6>] ? do_munmap+0x2b6/0x3a0
[<ffffffff81145136>] ? sys_munmap+0x56/0x80
[<ffffffff8100b0f2>] ? system_call_fastpath+0x16/0x1b
Modules linked in: bonding 8021q garp stp llc ipv6 dcdbas microcode serio_raw iTCO_wdt iTCO_vendor_support tg3 sg i3200_edac edac_core ext4 mbcach
panic occurred, switching back to text console
dm_log dm_mod [last unloaded: scsi_wait_scan]
CPU 2
Modules linked in: bonding 8021q garp stp llc ipv6 dcdbas microcode serio_raw iTCO_wdt iTCO_vendor_support tg3 sg i3200_edac edac_core ext4 mbcac]
Pid: 0, comm: swapper Tainted: G D --------------- 2.6.32-279.1.1.el6.x86_64 #1 Dell Inc. PowerEdge R200/0FW0G7
RIP: 0010:[<ffffffff81014877>] [<ffffffff81014877>] mwait_idle+0x77/0xd0
RSP: 0018:ffff88022ae51ee8 EFLAGS: 00000246
RAX: 0000000000000000 RBX: ffff88022ae51ef8 RCX: 0000000000000000
RDX: 0000000000000000 RSI: ffff88022ae51fd8 RDI: ffffffff81dda228
RBP: ffffffff8100ba4e R08: 0000000000000000 R09: 0000000000000002
R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000002
R13: ffff88022ae51e78 R14: ffffffff81099015 R15: ffff88022ae51e68
FS: 0000000000000000(0000) GS:ffff880028300000(0000) knlGS:0000000000000000
CS: 0010 DS: 0018 ES: 0018 CR0: 000000008005003b
CR2: 0000000000481046 CR3: 0000000001a85000 CR4: 00000000000406e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Process swapper (pid: 0, threadinfo ffff88022ae50000, task ffff88022ae26040)
Stack:
ffff88022ae51fd8 ffffffff81c017c0 ffff88022ae51f28 ffffffff81009e06
<d> ffff88022ae51f18 cf1d5955c0b9d404 0000000000000000 0000000000000000
<d> ffff88022ae51f48 ffffffff814f6cef 0000000000000000 00000002814f6ac5
Call Trace:
[<ffffffff81009e06>] ? cpu_idle+0xb6/0x110
[<ffffffff814f6cef>] ? start_secondary+0x22a/0x26d
Code: d2 65 48 8b 34 25 c8 cb 00 00 48 89 d1 48 8d 86 38 e0 ff ff 0f 01 c8 0f ae f0 48 8b 86 38 e0 ff ff a8 08 75 24 31 c0 fb 0f 01 c9 <5b> 41 5c
Call Trace:
[<ffffffff8150339a>] ? atomic_notifier_call_chain+0x1a/0x20
[<ffffffff81009e06>] ? cpu_idle+0xb6/0x110
[<ffffffff814f6cef>] ? start_secondary+0x22a/0x26d
bonding+VLAN という環境で使ってるので、設定ミスかと色々悩んだ結果、バグでした。
カーネル: 2.6.32-279.el6.x86_64
http://bugs.centos.org/view.php?id=5816
カーネルパニックに出会って、まわりに言ったらあっさりこんな情報を送ってくれました。orz
ちなみに、以下の手順でパニックが発生しました。
(1) bondingインターフェースをダウン
# ifdown bond0
(2) bondingインターフェースをアップ
# ifup bond0
ここで、突然通信できるようになりました。
(3) ネットワークスクリプトの再起動
# /etc/init.d/network restart
パニック発生
general protection fault: 0000 [#1] SMP
last sysfs file: /sys/devices/virtual/net/bond0.31/broadcast
CPU 1
Modules linked in: bonding 8021q garp stp llc ipv6 dcdbas microcode serio_raw iTCO_wdt iTCO_vendor_support tg3 sg i3200_edac edac_core ext4 mbcac]
Pid: 27521, comm: pidof Not tainted 2.6.32-279.1.1.el6.x86_64 #1 Dell Inc. PowerEdge R200/0FW0G7
RIP: 0010:[<ffffffff8143cc83>] [<ffffffff8143cc83>] dev_gro_receive+0x33/0x290
RSP: 0018:ffff880028283cb0 EFLAGS: 00010282
RAX: 677568097665646f RBX: ffff880229176480 RCX: ffff880229176480
RDX: 0000000000000608 RSI: ffff880229176480 RDI: ffff880228c8a760
RBP: ffff880028283ce0 R08: ffff880228d83020 R09: 0000000000000000
R10: fffffffffffffff0 R11: 0000000000000040 R12: ffff880228c8a760
R13: ffff880229176480 R14: ffff8802291764b8 R15: 000000000000001f
FS: 00007eff3549a700(0000) GS:ffff880028280000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007eff354a1000 CR3: 00000002277f4000 CR4: 00000000000406e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Process pidof (pid: 27521, threadinfo ffff880229382000, task ffff880227e8eae0)
Stack:
ffff880028283cc0 000000000000001f ffff880228c8a760 ffff880229176480
<d> ffff880229176480 000000000000001f ffff880028283d00 ffffffff814d7af8
<d> ffff880028283d20 ffff880229176480 ffff880028283d30 ffffffff814d7d7a
Call Trace:
<IRQ>
[<ffffffff814d7af8>] vlan_gro_common+0x188/0x230
[<ffffffff814d7d7a>] vlan_gro_receive+0x7a/0xa0
[<ffffffffa0250172>] tg3_poll_work+0x612/0xe30 [tg3]
[<ffffffff8110dc28>] ? perf_event_task_tick+0xa8/0x2f0
[<ffffffffa025807b>] tg3_poll+0x7b/0x440 [tg3]
[<ffffffff8143f1a3>] net_rx_action+0x103/0x2f0
[<ffffffff81073ec1>] __do_softirq+0xc1/0x1e0
[<ffffffff810db810>] ? handle_IRQ_event+0x60/0x170
[<ffffffff81073f1f>] ? __do_softirq+0x11f/0x1e0
[<ffffffff8100c24c>] call_softirq+0x1c/0x30
[<ffffffff8100de85>] do_softirq+0x65/0xa0
[<ffffffff81073ca5>] irq_exit+0x85/0x90
[<ffffffff81505b05>] do_IRQ+0x75/0xf0
[<ffffffff8100ba53>] ret_from_intr+0x0/0x11
<EOI>
[<ffffffff8112afc8>] ? release_pages+0x48/0x250
[<ffffffff811403a9>] ? get_user_pages+0x49/0x50
[<ffffffff8150327e>] ? do_page_fault+0x3e/0xa0
[<ffffffff8116b680>] ? mem_cgroup_get_reclaim_stat_from_page+0x20/0x70
[<ffffffff8112b517>] ____pagevec_lru_add+0x167/0x180
[<ffffffff8112b69b>] lru_add_drain+0x9b/0xa0
[<ffffffff811448ee>] unmap_region+0x4e/0x130
[<ffffffff81144ff6>] do_munmap+0x2b6/0x3a0
[<ffffffff81145136>] sys_munmap+0x56/0x80
[<ffffffff8100b0f2>] system_call_fastpath+0x16/0x1b
Code: 48 89 5d d8 4c 89 65 e0 4c 89 6d e8 4c 89 75 f0 4c 89 7d f8 0f 1f 44 00 00 48 8b 46 20 0f b7 56 7e 49 89 fc 48 89 f3 4c 8d 76 38 <f6> 40 71
RIP [<ffffffff8143cc83>] dev_gro_receive+0x33/0x290
RSP <ffff880028283cb0>
BUG: scheduling while atomic: swapper/0/0x10000100
---[ end trace fc3a501a071deef7 ]---
Kernel panic - not syncing: Fatal exception in interrupt
Pid: 27521, comm: pidof Tainted: G D --------------- 2.6.32-279.1.1.el6.x86_64 #1
Call Trace:
<IRQ> [<ffffffff814fd12a>] ? panic+0xa0/0x168
[<ffffffff815012d2>] ? oops_end+0xf2/0x100
[<ffffffff8100f26b>] ? die+0x5b/0x90
[<ffffffff81500e32>] ? do_general_protection+0x152/0x160
[<ffffffff8142fb82>] ? kfree_skb+0x42/0x90
[<ffffffff81500605>] ? general_protection+0x25/0x30
[<ffffffff8143cc83>] ? dev_gro_receive+0x33/0x290
[<ffffffff814d7af8>] ? vlan_gro_common+0x188/0x230
[<ffffffff814d7d7a>] ? vlan_gro_receive+0x7a/0xa0
[<ffffffffa0250172>] ? tg3_poll_work+0x612/0xe30 [tg3]
[<ffffffff8110dc28>] ? perf_event_task_tick+0xa8/0x2f0
[<ffffffffa025807b>] ? tg3_poll+0x7b/0x440 [tg3]
[<ffffffff8143f1a3>] ? net_rx_action+0x103/0x2f0
[<ffffffff81073ec1>] ? __do_softirq+0xc1/0x1e0
[<ffffffff810db810>] ? handle_IRQ_event+0x60/0x170
[<ffffffff81073f1f>] ? __do_softirq+0x11f/0x1e0
[<ffffffff8100c24c>] ? call_softirq+0x1c/0x30
[<ffffffff8100de85>] ? do_softirq+0x65/0xa0
[<ffffffff81073ca5>] ? irq_exit+0x85/0x90
[<ffffffff81505b05>] ? do_IRQ+0x75/0xf0
[<ffffffff8100ba53>] ? ret_from_intr+0x0/0x11
<EOI> [<ffffffff8112afc8>] ? release_pages+0x48/0x250
[<ffffffff811403a9>] ? get_user_pages+0x49/0x50
[<ffffffff8150327e>] ? do_page_fault+0x3e/0xa0
[<ffffffff8116b680>] ? mem_cgroup_get_reclaim_stat_from_page+0x20/0x70
[<ffffffff8112b517>] ? ____pagevec_lru_add+0x167/0x180
[<ffffffff8112b69b>] ? lru_add_drain+0x9b/0xa0
[<ffffffff811448ee>] ? unmap_region+0x4e/0x130
[<ffffffff81144ff6>] ? do_munmap+0x2b6/0x3a0
[<ffffffff81145136>] ? sys_munmap+0x56/0x80
[<ffffffff8100b0f2>] ? system_call_fastpath+0x16/0x1b
Modules linked in: bonding 8021q garp stp llc ipv6 dcdbas microcode serio_raw iTCO_wdt iTCO_vendor_support tg3 sg i3200_edac edac_core ext4 mbcach
panic occurred, switching back to text console
dm_log dm_mod [last unloaded: scsi_wait_scan]
CPU 2
Modules linked in: bonding 8021q garp stp llc ipv6 dcdbas microcode serio_raw iTCO_wdt iTCO_vendor_support tg3 sg i3200_edac edac_core ext4 mbcac]
Pid: 0, comm: swapper Tainted: G D --------------- 2.6.32-279.1.1.el6.x86_64 #1 Dell Inc. PowerEdge R200/0FW0G7
RIP: 0010:[<ffffffff81014877>] [<ffffffff81014877>] mwait_idle+0x77/0xd0
RSP: 0018:ffff88022ae51ee8 EFLAGS: 00000246
RAX: 0000000000000000 RBX: ffff88022ae51ef8 RCX: 0000000000000000
RDX: 0000000000000000 RSI: ffff88022ae51fd8 RDI: ffffffff81dda228
RBP: ffffffff8100ba4e R08: 0000000000000000 R09: 0000000000000002
R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000002
R13: ffff88022ae51e78 R14: ffffffff81099015 R15: ffff88022ae51e68
FS: 0000000000000000(0000) GS:ffff880028300000(0000) knlGS:0000000000000000
CS: 0010 DS: 0018 ES: 0018 CR0: 000000008005003b
CR2: 0000000000481046 CR3: 0000000001a85000 CR4: 00000000000406e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Process swapper (pid: 0, threadinfo ffff88022ae50000, task ffff88022ae26040)
Stack:
ffff88022ae51fd8 ffffffff81c017c0 ffff88022ae51f28 ffffffff81009e06
<d> ffff88022ae51f18 cf1d5955c0b9d404 0000000000000000 0000000000000000
<d> ffff88022ae51f48 ffffffff814f6cef 0000000000000000 00000002814f6ac5
Call Trace:
[<ffffffff81009e06>] ? cpu_idle+0xb6/0x110
[<ffffffff814f6cef>] ? start_secondary+0x22a/0x26d
Code: d2 65 48 8b 34 25 c8 cb 00 00 48 89 d1 48 8d 86 38 e0 ff ff 0f 01 c8 0f ae f0 48 8b 86 38 e0 ff ff a8 08 75 24 31 c0 fb 0f 01 c9 <5b> 41 5c
Call Trace:
[<ffffffff8150339a>] ? atomic_notifier_call_chain+0x1a/0x20
[<ffffffff81009e06>] ? cpu_idle+0xb6/0x110
[<ffffffff814f6cef>] ? start_secondary+0x22a/0x26d
外部に借りているVPSを、zabbixで監視したいけど、平文でやり取りするのは不安・・・
そんなとき、stunnelを使ってみませんか。
自分もどうしようかと悩んでいた時、@BlueSkyDetector氏の「そういえばZabbixの通信暗号化ってStunnelを使えいいじゃん。あとで試そう。」ってつぶやきを見つけて、挑戦してみました。
しかもstunnelって、実はcentosを最小インストールしても入ってくる身近な存在だったのです。
やりたいことをまとめると、
1 zabbixサーバ-zabbixエージェント間の通信を暗号化したい。
2 第三者がzabbixエージェントに接続できないようにしたい。
さて構成ですが、こんな感じです。
紺色の矢印が、平文でながれるところです。
さて方法ですが、まず以下の証明書を用意してください。
1 サーバの秘密鍵
2 サーバ証明書
3 サーバ証明書に署名したオレオレCAの証明書
このうち 3 の証明書が、第三者を締め出す肝になります。
以下、証明書は、/etc/stunnel 配下に配置、設定ファイルは /etc/stunnel.conf とします。
【zabbixエージェント側の作業】
zabbixサーバからの接続を受け付けるので、stunnelはサーバモード(デフォルト動作)で動作させます。
1 証明書の配置
上記1~3の証明書を、配置します。
2 CA証明書の名前をハッシュ化
CA証明書の指定の仕方は二通りあって、CApathでディレクトリを指定するか、CAfileでファイル名を直接指定します。
CApathを使う場合、配下のCA証明書の名前はハッシュ化されていないといけないので、以下のコマンドを実行してください。
#c_rehash /etc/stunnel
ちなみにc_rehashコマンドは、CentOSだと、openssl-perl パッケージに入っています。
3 設定ファイルの記述
[/etc/stunnel.conf]
pid = /var/run/stunnel.pid
cert = /etc/stunnel/server.crt
key = /etc/stunnel/server.key
[zabbix]
accept = 10058
connect = 10050
verify = 2
CApath = /etc/stunnel
;CAfile = /etc/stunnel/cacert.pem
acceptで待ち受けポート、connectで接続先サーバを指定しています。
これだと、すべてのローカルアドレス:10050 で待ち受け、localhost:10050 に転送することになります。
また、verifyでクライアント認証を有効にしています。
4 プログラムの起動
# stunnel /etc/stunnel.conf
【zabbixサーバ側の作業】
zabbixサーバからエージェントに対して接続にいくので、stunnelはクライアントモードで動作させます。
1 証明書の配置
上記1~2の証明書を、配置します。
面倒なので、同じ証明書を使っちゃいます。
2 3 設定ファイルの記述
[/etc/stunnel.conf]
pid = /var/run/stunnel.pid
key = /etc/stunnel/sakura.shinobi.jp.key
cert = /etc/stunnel/sakura.shinobi.jp.crt
[zabbix_client]
client = yes
accept = 127.0.0.1:10060
connect = zabbix-agent.hogehoge.com:10055
3 プログラムの起動
# stunnel /etc/stunnel.conf
これで、zabbixサーバのlocalhost:10060 に接続すると、zabbixエージェントから応答が返ってきます。
また、openssl s_clientコマンドで、直接zabbixエージェントのstunnelに接続しようとすると、怒られますので、クライアント認証も機能しているようです。
なお通信経路の暗号化だけであれば、zabbixサーバ側のstunnelにkey、certで証明書を指定する必要はありません。
これでVPSにいたずらされることもなくなって、めでたしめでたし
そんなとき、stunnelを使ってみませんか。
自分もどうしようかと悩んでいた時、
しかもstunnelって、実はcentosを最小インストールしても入ってくる身近な存在だったのです。
やりたいことをまとめると、
1 zabbixサーバ-zabbixエージェント間の通信を暗号化したい。
2 第三者がzabbixエージェントに接続できないようにしたい。
さて構成ですが、こんな感じです。
紺色の矢印が、平文でながれるところです。
さて方法ですが、まず以下の証明書を用意してください。
1 サーバの秘密鍵
2 サーバ証明書
3 サーバ証明書に署名したオレオレCAの証明書
このうち 3 の証明書が、第三者を締め出す肝になります。
以下、証明書は、/etc/stunnel 配下に配置、設定ファイルは /etc/stunnel.conf とします。
【zabbixエージェント側の作業】
zabbixサーバからの接続を受け付けるので、stunnelはサーバモード(デフォルト動作)で動作させます。
1 証明書の配置
上記1~3の証明書を、配置します。
2 CA証明書の名前をハッシュ化
CA証明書の指定の仕方は二通りあって、CApathでディレクトリを指定するか、CAfileでファイル名を直接指定します。
CApathを使う場合、配下のCA証明書の名前はハッシュ化されていないといけないので、以下のコマンドを実行してください。
#c_rehash /etc/stunnel
ちなみにc_rehashコマンドは、CentOSだと、openssl-perl パッケージに入っています。
3 設定ファイルの記述
[/etc/stunnel.conf]
pid = /var/run/stunnel.pid
cert = /etc/stunnel/server.crt
key = /etc/stunnel/server.key
[zabbix]
accept = 10058
connect = 10050
verify = 2
CApath = /etc/stunnel
;CAfile = /etc/stunnel/cacert.pem
acceptで待ち受けポート、connectで接続先サーバを指定しています。
これだと、すべてのローカルアドレス:10050 で待ち受け、localhost:10050 に転送することになります。
また、verifyでクライアント認証を有効にしています。
4 プログラムの起動
# stunnel /etc/stunnel.conf
【zabbixサーバ側の作業】
zabbixサーバからエージェントに対して接続にいくので、stunnelはクライアントモードで動作させます。
1 証明書の配置
上記1~2の証明書を、配置します。
面倒なので、同じ証明書を使っちゃいます。
2 3 設定ファイルの記述
[/etc/stunnel.conf]
pid = /var/run/stunnel.pid
key = /etc/stunnel/sakura.shinobi.jp.key
cert = /etc/stunnel/sakura.shinobi.jp.crt
[zabbix_client]
client = yes
accept = 127.0.0.1:10060
connect = zabbix-agent.hogehoge.com:10055
3 プログラムの起動
# stunnel /etc/stunnel.conf
これで、zabbixサーバのlocalhost:10060 に接続すると、zabbixエージェントから応答が返ってきます。
また、openssl s_clientコマンドで、直接zabbixエージェントのstunnelに接続しようとすると、怒られますので、クライアント認証も機能しているようです。
なお通信経路の暗号化だけであれば、zabbixサーバ側のstunnelにkey、certで証明書を指定する必要はありません。
これでVPSにいたずらされることもなくなって、めでたしめでたし
fedora15になってサービス管理がガラッとかわり、/etc/init.d/の下の起動スクリプトではなく、systemctlコマンドでサービスの操作を行うようになった。
今回、jettyをサービスとしてfedoraに登録した際に手間取ったので、ここにメモしておく。
使用したjettyのバージョンは、jetty-hightide-8.1.3.v20120416
まず、fedora15になってサービスに関する情報は、/lib/systemd/system 配下に集められた。
サービスを登録する場合、今までどおり起動スクリプトを/etc/init.d配下に置き、chkconfig --addで登録することも可能だが、せっかくだからsystemdの作法に従って登録したい。
そのためには、以下のような設定ファイルを書かなければいけない。
【jetty.service】
[Unit]
Description=Jetty Application Containar
[Service]
Type=simple
EnvironmentFile=-/opt/jetty/etc/jetty-env
PIDFile=/var/run/jetty.pid
User=jetty
Group=jetty
ExecStart=/usr/bin/java $RUN_ARGS
StandardOutput=null
[Install]
WantedBy=multi-user.target
そのうえで、systemctl --system daemon-reload をすれば完了。
上の設定ファイルで、EnvironmentFileにより環境変数を定義したファイルを読み込んでいるが、環境変数はExecStartでの定義にのみ使えるようだ。
User、Groupで使ってみたら、エラーになった。
なおsystemdの設定ファイルに関する情報はまだまだ少なく、結局man systemd.serviceと既存の設定ファイルが一番役に立った。
今回、jettyをサービスとしてfedoraに登録した際に手間取ったので、ここにメモしておく。
使用したjettyのバージョンは、jetty-hightide-8.1.3.v20120416
まず、fedora15になってサービスに関する情報は、/lib/systemd/system 配下に集められた。
サービスを登録する場合、今までどおり起動スクリプトを/etc/init.d配下に置き、chkconfig --addで登録することも可能だが、せっかくだからsystemdの作法に従って登録したい。
そのためには、以下のような設定ファイルを書かなければいけない。
【jetty.service】
[Unit]
Description=Jetty Application Containar
[Service]
Type=simple
EnvironmentFile=-/opt/jetty/etc/jetty-env
PIDFile=/var/run/jetty.pid
User=jetty
Group=jetty
ExecStart=/usr/bin/java $RUN_ARGS
StandardOutput=null
[Install]
WantedBy=multi-user.target
そのうえで、systemctl --system daemon-reload をすれば完了。
上の設定ファイルで、EnvironmentFileにより環境変数を定義したファイルを読み込んでいるが、環境変数はExecStartでの定義にのみ使えるようだ。
User、Groupで使ってみたら、エラーになった。
なおsystemdの設定ファイルに関する情報はまだまだ少なく、結局man systemd.serviceと既存の設定ファイルが一番役に立った。
巷で話題のfluentを、導入してみることにした。
だが、gem install fluent ってやるのはいかがなものか。
rubyのバージョンもあるが、いろいろなパッケージが勝手に入って、精神衛生上よろしくない。
fedoraをつかってるので、できればRPMにしたい。
でもSPECファイル書くの面倒くさいなぁと思っていたら、意外にも簡単にできました。
ざっくり流れを書くと
(1)td-agentのSRPMをもってくる。
(2)fluentの最新ソースをダウンロード
(3)td-agentパッケージを解凍して、SPECファイルを編集
(4)td-agentにはいっているautogen.sh、Makefile.amをfluentdのディレクトリにコピーし、編集
(5)fluentdをtarでアーカイブ
(6)ビルドに必要なライブラリ(libyaml-devel)をインストール
(7)rpmbuildでパッケージ化
ってなもんです。
他人のふんどしで相撲を取ってるようなもんですけど、以下に詳細な手順を記します。
【パッケージ作成手順】
(1)td-agentのSRPMSをもってくる。
ここ からパッケージをもってくる。(今回は、td-agent-1.1.3.1 を使いました。)
ちなみに、rpmパッケージは以下のコマンドで解凍できます。
# rpm2cpio td-agent-1.1.3.1-0.src.rpm | cpio -id
(2)fluentの最新ソースをダウンロード
ここから最新のfluentのソースをもってきます。
開発が活発なので、ひと月もたつとすっかり古くなります。
(3)td-agentパッケージを解凍して、SPECファイルなどを編集
SRPMを解凍して中身を修正します。
1 SPECファイルの編集
文字列"td-agent"を"fluentd"に置換します。
# sed -i s/td-agent/fluentd/g td-agent.spec
また、Version:を今回入れるfluentdのバージョンにします。
2 ファイル名変更
td-agent.init → fluentd.init
td-agent.spec → fluentd.spec
(4)td-agent-xx.xx.xx.tar.gzにはいっている以下のファイルをfluentdのディレクトリにコピーし、編集
・autogen.sh
一緒にコンパイルするruby、その他モジュールのバージョンを変更します。
せっかくなので、新しいバージョンでパッケージ。
download "http://ftp.ruby-lang.org/pub/ruby/1.9" "ruby-1.9.3-p125.tar.bz2"
download "http://rubygems.org/downloads" "json-1.6.6.gem"
download "http://rubygems.org/downloads" "msgpack-0.4.6.gem"
download "http://rubygems.org/downloads" "iobuffer-0.1.3.gem"
download "http://rubygems.org/downloads" "cool.io-1.1.0.gem"
download "http://rubygems.org/downloads" "http_parser.rb-0.5.3.gem"
download "http://rubygems.org/downloads" "yajl-ruby-1.1.0.gem"
download "http://rubygems.org/downloads" "jeweler-1.8.3.gem"
download "http://rubygems.org/downloads" "psych-1.3.2.gem"
・Makefile.am
一緒にパッケージ化したいプラグインを追加します。
PLUGINS = \
fluent-plugin-td-0.10.6.gem \
fluent-plugin-hoop-0.1.2.gem \
fluent-plugin-zabbix-0.0.1.gem \
fluent-plugin-scribe-0.10.7.gem \
fluent-plugin-hipchat-0.1.0.gem \
fluent-plugin-forest-0.1.0.gem \
fluent-plugin-cassandra-0.0.2.gem \
fluent-plugin-mongo-0.6.7.gem
また、td-agentという文字列をfluentdに一括置換します。
# sed -i -e s/td-agent/fluentd/g Makefile.am
・td-agent.prelink.conf
ファイル名を、fluentd.prelink.confに変更します。
・configure.in
そのままコピーします。
・td-agent.conf
fluentd.confとしてコピーします。
(5)fluentdをtarでアーカイブ
ディレクトリ名をfluentd-0.10.18 のような名前にして、fluentd-0.10.18.tar.gzのように
アーカイブします。
これを、td-agent-xx.xx.xx.tar.gzと入れ替えます。
(5)ビルドに必要なライブラリ(libyaml-devel)をインストール
fedoraだと、標準のリポジトリにあるので、yum install libyaml-devel すればよいです。
CentOSだと用意されていないので、EPELから持ってきてください。
→td-agent-1.1.4では、BuildRequiresにlibyaml-develが追加されたようで、ないと先に進めません。
1.1.3ではエラーは出るがとりあえずコンパイルが走った。
(6)rpmbuildでパッケージ化
あとは、各ファイルを所定の位置に配置して、コマンドを実行です。
# rpmbuild -ba fluentd.spec (ポチっとな)
これで完了。
やっぱり SRPMがあると、パッケージ化が楽ですね。
だが、gem install fluent ってやるのはいかがなものか。
rubyのバージョンもあるが、いろいろなパッケージが勝手に入って、精神衛生上よろしくない。
fedoraをつかってるので、できればRPMにしたい。
でもSPECファイル書くの面倒くさいなぁと思っていたら、意外にも簡単にできました。
ざっくり流れを書くと
(1)td-agentのSRPMをもってくる。
(2)fluentの最新ソースをダウンロード
(3)td-agentパッケージを解凍して、SPECファイルを編集
(4)td-agentにはいっているautogen.sh、Makefile.amをfluentdのディレクトリにコピーし、編集
(5)fluentdをtarでアーカイブ
(6)ビルドに必要なライブラリ(libyaml-devel)をインストール
(7)rpmbuildでパッケージ化
ってなもんです。
他人のふんどしで相撲を取ってるようなもんですけど、以下に詳細な手順を記します。
【パッケージ作成手順】
(1)td-agentのSRPMSをもってくる。
ここ からパッケージをもってくる。(今回は、td-agent-1.1.3.1 を使いました。)
ちなみに、rpmパッケージは以下のコマンドで解凍できます。
# rpm2cpio td-agent-1.1.3.1-0.src.rpm | cpio -id
(2)fluentの最新ソースをダウンロード
ここから最新のfluentのソースをもってきます。
開発が活発なので、ひと月もたつとすっかり古くなります。
(3)td-agentパッケージを解凍して、SPECファイルなどを編集
SRPMを解凍して中身を修正します。
1 SPECファイルの編集
文字列"td-agent"を"fluentd"に置換します。
# sed -i s/td-agent/fluentd/g td-agent.spec
また、Version:を今回入れるfluentdのバージョンにします。
2 ファイル名変更
td-agent.init → fluentd.init
td-agent.spec → fluentd.spec
(4)td-agent-xx.xx.xx.tar.gzにはいっている以下のファイルをfluentdのディレクトリにコピーし、編集
・autogen.sh
一緒にコンパイルするruby、その他モジュールのバージョンを変更します。
せっかくなので、新しいバージョンでパッケージ。
download "http://ftp.ruby-lang.org/pub/ruby/1.9" "ruby-1.9.3-p125.tar.bz2"
download "http://rubygems.org/downloads" "json-1.6.6.gem"
download "http://rubygems.org/downloads" "msgpack-0.4.6.gem"
download "http://rubygems.org/downloads" "iobuffer-0.1.3.gem"
download "http://rubygems.org/downloads" "cool.io-1.1.0.gem"
download "http://rubygems.org/downloads" "http_parser.rb-0.5.3.gem"
download "http://rubygems.org/downloads" "yajl-ruby-1.1.0.gem"
download "http://rubygems.org/downloads" "jeweler-1.8.3.gem"
download "http://rubygems.org/downloads" "psych-1.3.2.gem"
・Makefile.am
一緒にパッケージ化したいプラグインを追加します。
PLUGINS = \
fluent-plugin-td-0.10.6.gem \
fluent-plugin-hoop-0.1.2.gem \
fluent-plugin-zabbix-0.0.1.gem \
fluent-plugin-scribe-0.10.7.gem \
fluent-plugin-hipchat-0.1.0.gem \
fluent-plugin-forest-0.1.0.gem \
fluent-plugin-cassandra-0.0.2.gem \
fluent-plugin-mongo-0.6.7.gem
また、td-agentという文字列をfluentdに一括置換します。
# sed -i -e s/td-agent/fluentd/g Makefile.am
・td-agent.prelink.conf
ファイル名を、fluentd.prelink.confに変更します。
・configure.in
そのままコピーします。
・td-agent.conf
fluentd.confとしてコピーします。
(5)fluentdをtarでアーカイブ
ディレクトリ名をfluentd-0.10.18 のような名前にして、fluentd-0.10.18.tar.gzのように
アーカイブします。
これを、td-agent-xx.xx.xx.tar.gzと入れ替えます。
(5)ビルドに必要なライブラリ(libyaml-devel)をインストール
fedoraだと、標準のリポジトリにあるので、yum install libyaml-devel すればよいです。
CentOSだと用意されていないので、EPELから持ってきてください。
→td-agent-1.1.4では、BuildRequiresにlibyaml-develが追加されたようで、ないと先に進めません。
1.1.3ではエラーは出るがとりあえずコンパイルが走った。
(6)rpmbuildでパッケージ化
あとは、各ファイルを所定の位置に配置して、コマンドを実行です。
# rpmbuild -ba fluentd.spec (ポチっとな)
これで完了。
やっぱり SRPMがあると、パッケージ化が楽ですね。
ブログ内検索
カテゴリー
最新記事
(11/08)
(11/07)
(12/27)
(12/07)
(09/28)
最新トラックバック
プロフィール
HN:
アフロ
性別:
非公開
リコメンド