Zabbix構築・運用ガイド

# Zabbix構築・運用ガイド

## 1.概要

### 1-1. 説明すること

Zabbixの構築・設定・運用について記載する。

* **構築について**  
  単一サーバ上にWebサーバ(Apache httpd)・APLサーバ(Zabbix Server)・DBサーバ(MySQL)を全乗せする構成で構築する。  
* **設定について**  
  Zabbixの設定は、設定箇所をなるべく局所化／ルール化しないとカオスになるため、可能な限り設定作業を自動化するよう、Zabbixの機能を活用する。  
* **運用について**  
  実運用で遭遇したトラブルシュートや経験談も都度追記していく。  

### 1-2. 今回の構築環境

OS:CentOS 6.8
Version:Zabbix 2.4

### 1-2. 参考にしたサイト
* [CentOS6 zabbixインストール](https://www.server-world.info/query?os=CentOS_6&p=zabbix)
* [日本語フォント設定方法](http://sechiro.hatenablog.com/entry/2013/08/27/Zabbix_2.0_%E3%81%AE%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%82%92%E7%9B%B4%E3%81%99%E3%80%81%E3%80%8Calternatives%E3%80%8D%E3%81%A7%E3%81%AE%E6%97%A5%E6%9C%AC)

## 2. Zabbix構築

### 2-1. Zabbixインストール

1. Zabbixリポジトリ登録  
<pre>
yum install http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm
</pre>
2. パッケージインストール  
<pre>
yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent zabbix_get
yum install httpd mysql-server
yum install php-mysql php-gd php-xml php-bcmath 
</pre>
3. 設定ファイルのバックアップ  
<pre>
cp -pi /etc/my.cnf /etc/my.cnf.org
cp -pi /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
cp -pi /etc/zabbix/zabbix_server.conf /etc/zabbix/zabbix_server.conf.org
</pre>
4. MySQL設定  
  1. my.cnf  
<pre>
vi /etc/my.cnf
utfを有効にする
character-set-server=utf8　を追加
</pre>
  2. サービス起動  
<pre>
service mysqld start
</pre>
  3. chkconfig設定  
<pre>
chkconfig mysqld on
</pre>
  4. mysql_secure_install設定  
<pre>
mysql_secure_installation
</pre>
  5. DB作成  
<pre>
mysql -u root -p
mysql> create database zabbix; 
</pre>
  6. 権限付与/パスワード設定  
  ここでは例としてパスワードを'password'とした。
<pre>
mysql> grant all privileges on zabbix.* to zabbix@'localhost' identified by 'password'; 
mysql> grant all privileges on zabbix.* to zabbix@'%' identified by 'password'; 
mysql> flush privileges; 
mysql> \q
</pre>
5. httpd設定  
  1. php.ini設定  
<pre>  
vi /etc/php.ini
timezoneを"Asia/Tokyo"にする
vi zabbix_server.conf
</pre>
  2. サービス起動  
<pre>
service httpd start
</pre>
  3. chkconfig設定  
<pre>
chkconfig httpd on
</pre>
6. Zabbixサーバ設定  
  1. 初期設定をする  
  DBのパスワードは先ほど設定したものと合わせる。
<pre>
vi /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBPassword=password
</pre>
  2. データをインポートする  
<pre>
cd /usr/share/doc/zabbix-server-mysql-2.4.8/create/
mysql -u root -p zabbix < schema.sql 
mysql -u root -p zabbix < images.sql 
mysql -u root -p zabbix < data.sql 
</pre>
  3. Zabbixサーバを起動する  
<pre>
service zabbix-server start
</pre>
  4. iptablesの許可設定  
コマンドは環境にあわせて変更する。直接 /etc/sysconfig/iptables を修正してもよい。
今回はiptablesの５行目にルールを追加する。
<pre>
iptables -I INPUT 5 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
service iptables save
</pre> 
7. WebブラウザからZabbixサーバにアクセス  
<pre>
http://IPアドレス/zabbix
初期ID: Admin
初期パスワード: zabbix
</pre>

### 2-2. 任意の導入  
1. フォント設定（グラフ描画で日本語が表示されない場合）  
  1. IPAゴシックのパッケージをインストール  
<pre>
yum install ipa-pgothic-fonts
</pre>
  2. IPAゴシックのフォントの優先度を高くする  
<pre>
alternatives --install /usr/share/zabbix/fonts/graphfont.ttf zabbix-web-font /usr/share/fonts/ipa-pgothic/ipagp.ttf 1000
</pre>
  3. 設定反映  
<pre>
alternatives --display zabbix-web-font
</pre>
2. メールの外部配送設定（通知メールを外部配送する場合）
  1. パッケージをインストール  
<pre>
yum install postfix cyrus-sasl-plain mailx
</pre>
  2. main.cfに設定を追加  
<pre>
vi /etc/postfix/main.cf
relayhost = [smtp.nifty.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_mechanism_filter = plain
smtp_sasl_password_maps = hash:/etc/postfix/nifty_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_use_tls = yes
</pre>
  3. パスワードファイルを作成  
<pre>
touch /etc/postfix/nifty_passwd
</pre>
  4. パスワードファイルに各種情報を記載  
<pre>
vi /etc/postfix/nifty_passwd
[smtp.nifty.com]:587 xxxxx@nifty.com:パスワード
</pre>
  5. パスワードファイルを Berkeley DB形式に変換  
<pre>
postmap /etc/postfix/nifty_passwd
</pre>
  6. 返還後のファイル形式を確認  
<pre>
file /etc/postfix/nifty_passwd.db 
nifty_passwd.db: Berkeley DB (Hash, version 9, native byte-order)
</pre>
  7. ファイルの中身を確認  
<pre>
db_dump -p /etc/postfix/nifty_passwd.db 
VERSION=3
format=print
type=hash
h_nelem=4097
db_pagesize=4096
HEADER=END
\[smtp.nifty.com]:587\00
xxxxx@nifty.com:パスワード\00
DATA=END
</pre>
  8. postfixを再起動  
<pre>
service postfix restart
</pre>
  9. テストメールを送信  
<pre>
echo "This mail is test" | mail -s "test mail" -r メールアカウント名@nifty.com メールアカウント名@nifty.com
</pre>
2. SNMPトラップ受信設定（SNTPのトラップ監視を用いる場合）  
  1. パッケージをインストールする  
<pre>
yum install net-snmp net-snmp-perl net-snmp-utils snmptt
</pre>
  2. 設定ファイルをバックアップする  
<pre>
cp -pi /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.org
cp -pi /etc/snmp/snmptrapd.conf /etc/snmp/snmptrapd.conf.org
cp -pi /etc/snmp/snmptt.ini /etc/snmp/snmptt.ini.org
</pre>
  3. snmptrapd.confの設定  
  ここでは例としてコミュニティ名は'public'とした。
<pre>
vi /etc/snmp/snmptrapd.conf
authCommunity   log,execute,net public
traphandle default /usr/sbin/snmptthandler
</pre>
  4. snmptrapdの設定
<pre>
vi /etc/sysconfig/snmptrapd
OPTIONS="-On -Lsd -p /var/run/snmptrapd.pid"
</pre>
<pre>
vi /etc/init.d/snmptrapd
OPTIONS="-On -Lsd -p /var/run/snmptrapd.pid"
</pre>
  5. snmptt.iniの設定
<pre>
vi /etc/snmp/snmptt.ini
date_time_format = %Y/%m%d %H:%M:%S
</pre>
  6. snmptt.confの設定
<pre>
vi /etc/snmp/snmptt.conf
EVENT general .* "General event" Normal
FORMAT ZBXTRAP $aA $*
</pre>
  7. サービス起動  
<pre>
service snmptt start
service snmptrapd start
</pre>
  8. chkconfig設定  
<pre>
chkconfig snmptt on
chkconfig snmptrapd on
</pre>
  9. Zabbixサーバ再起動  
<pre>
service zabbix-server restart
</pre>
  10. iptablesの許可設定
<pre>
iptables -I INPUT 5 -p udp -m state --state NEW -m udp --dport 162 -j ACCEPT 
service iptables save
</pre>
  11. 自ホストへsnmptrapを送信
<pre>
snmptrap -v 2c -c public localhost '' .1.3.6.1.4.1.8072.9999 .1.3.6.1.4.1.8072.9999 s 'TEST'
</pre>
  12. snmptt.logにトラップログの出力確認
<pre>
cat /var/log/snmptt/snmptt.log
2016/08/25 23:05:35 .1.3.6.1.4.1.8072.9999 Normal "General event" localhost - ZBXTRAP 127.0.0.1 TEST
</pre>

## 3.Zabbix設定

### 3-1. 設定する順番

以下の順で設定を行っていく
1. メディアタイプ作成
2. ユーザグループ作成
3. ユーザ作成
4. ホストグループ作成
5. ディスカバリルール作成
6. テンプレート作成
7. アプリケーション作成
8. アイテム作成
9. アクション（トリガー）作成
10. グラフ作成
11. アクション（ディスカバリ）作成


### 3-2. 設定の流れについて

まず、メディアタイプ・ユーザグループ・ユーザの設定を行う。
これらの情報は監視対象のホスト情報と切り離されているため変更しやすい。

次に、監視対象のホスト・ネットワーク機器の登録設定から、監視内容、通知条件、グラフの作成を行う。
前述したが、これらは可能な限り自動登録、変更箇所を局所化しないと運用してから泣くことになる。

流れとしては、IPアドレスベースにディスカバリルールを作成、ICMP Pingで発見後、あらかじめ作成した定義をもとに監視対象（物理サーバ、ネットワーク機器、VMなど）の自動登録、監視項目（アイテム）の設定、障害時の通知設定、グラフの作成まで自動で行うようにすることで、あとから監視対象が追加になったときもIPアドレスを追加することで自動設定されるようになる。

一方、Zabbixエージェントレスでの監視の場合、どうしても手動で設定しなければいけない箇所があるため、そこは諦めて手動でポチポチする。

### 3-3. Zabbix設定手順

1. メディアタイプ作成  
Zabbixサーバからメールを送信するため、SMTPサーバとSMTP heloをlocalhost.localdomainとする。  
今回メディアタイプの名前は Email としているが、宛先が複数になる場合は、
メールアドレスを名前に設定することが望ましい。
<pre>
[管理]->[メディアタイプ]->[メディアタイプの作成]からメディアタイプを作成する
</pre>
例）外部メールサーバを中継しない場合(Zabbixサーバから直接送信する場合)  
<pre>
名前：Email
タイプ：メール
SMTPサーバ：localhost.localdomain
SMTP helo：localhost.localdomain
送信元メールアドレス：zabbix@example.com
</pre>
例）外部メールサーバを中継する場合  
＠niftyのメールアカウントを用いて、＠niftyのメールアドレスへ送信する。
外部メールサーバを中継する場合、Zabbixサーバ上のメールサーバの設定が必要（後述）。  
<pre>
名前：Email
タイプ：メール
SMTPサーバ：localhost.localdomain
SMTP helo：localhost.localdomain
送信元メールアドレス：xxxxx@nifty.com
</pre>
2. ユーザグループ作成  
<pre>
[管理］->[ユーザ]->[ユーザグループ]からユーザグループを作成する
</pre>
例）管理者権限
<pre>
グループ名：Administrator
Webインタフェースへのアクセス：システムデフォルト
有効：チェック
</pre>
例）ユーザ権限
<pre>
グループ名：Users
Webインタフェースへのアクセス：システムデフォルト
有効：チェック
</pre>
3. ユーザ作成  
  1. ユーザタブ  
<pre>
[管理]->[ユーザ]->[ユーザ]からユーザを作成する
</pre>
例）鈴木一郎  
今回は以下のユーザの追加を例とする
<pre>
名前：Ichiro
名字：Suzuki
メールアドレス：ichiro-suzuki@example.com
権限：管理者
</pre>
エイリアスはメールのアドレス部分(ここではichiro-suzuki)としておき、初期パスワードと同一としておくと初期パスワードの設定に悩まなくて済む。初期パスワードは速やかに変更してもらう。
<pre>
エイリアス：ichiro-suzuki
名前：Ichiro
名字：Suzuki
グループ：Administrator
パスワード：ichiro-suzuki
言語：日本語(ja_JP)
</pre>
  2. メディアタブ  
<pre>
[追加]から新規メディアを追加する
</pre>
例）新規メディアの追加
<pre>
タイプ：Email
送信先：ichiro-suzuki@example.com
ステータス：有効
</pre>
  3. 権限タブ
<pre>
ユーザの種類：Zabbix特権管理者
</pre>
4. ホストグループ作成  
ホストグループ
<pre>
ホストグループ：sample hosts
</pre>
5. ディスカバリルール作成  
ネットワーク機器や稼働中のサーバなど、Zabbixエージェントがインストールできない監視対象に対してはディスカバリで シンプルチェック（ICMP Ping・ポートチェック・SNMPポーリングなど）で監視対象を発見し、監視対象に組み込む。  
Zabbixエージェントがインストールされている監視対象に対しては、Zabbixエージェントを選択する。
作成するルールは、以下のルールごとに作成するとよい。
  * チェック方法ごと（シンプルチェック or Zabbixエージェントチェック）  
  * サーバやネットワーク機器ごと（Cisco Router, Cisco Catalyst, Fujitsu primergy)  
  * OSごと（Linux, Windows)  
例）シンプルチェックでのルール設定
<pre>
ディスカバリ名：Home network appliance
IPアドレスの範囲:192.168.1.1,192.168.1.24-64
チェック:ICMP ping
</pre>
例）Zabbixエージェントでのルール設定
<pre>
ディスカバリ名：Fujitsu primergy
IPアドレスの範囲:192.168.1.65-128
チェック:Zabbixエージェント
キー：Linux
デバイスの固有性を特定する基準：Zabbixエージェント "Linux"
</pre>
6. テンプレート作成  
監視項目ごとにテンプレートを作成する  
監視項目の例（死活監視、サービス監視、インタフェース監視）
  1. 死活監視  
デフォルトでICMP用のテンプレートが用意されているので複製して使用する
デフォルトのテンプレートは今後使用することを考えてそのまま残しておき、使用する場合は複製して使用する
作成したテンプレートをグループ（今回は sample hosts）に紐付けることで、使用するテンプレートをわかりやすくしている
<pre>
テンプレート名：ICMP Ping（Template ICMP Pingを複製して作成）
所属グループ：sample hosts
</pre>
  2. サービス監視  
<pre>
テンプレート名：HTTP Service（Template App HTTP Serviceを複製して作成）
所属グループ：sample hosts
</pre>
  3. インタフェース監視  
Template SNMP Devicesのテンプレートを元にテンプレートを作成する。
Template SNMP Devicesは、Template SNMP GenericとTemplate SNMP Interfacesに紐付いているため、同様にそれぞれ元のテンプレートから複製して作成する。
作成後は、SNMP Devicesのテンプレートに２つのテンプレートを紐付けする。
<pre>
テンプレート名：SNMP Device（Template SNMP Deviceを複製して作成）
テンプレート名：SNMP Generic（Template SNMP Genericを複製して作成）
テンプレート名：SNMP Interfaces（Template SNMP Interfacesを複製して作成）
</pre>
7. アプリケーション作成  
アプリケーションはテンプレートと同一名でユニークにする。
SNMPはポーリングとトラップによる監視があるため、ポーリング用をSNMP poling、
トラップ用をSNMP trapとする。
例）死活監視
<pre>
アプリケーション：ICMP Ping
</pre>
例）サービス監視
<pre>
アプリケーション：HTTP Service
</pre>
例）インタフェース監視（SNMP polig）
<pre>
アプリケーション：SNMP poling
</pre>
例）インタフェース監視（SNMP trap）
<pre>
アプリケーション：SNMP trap
</pre>
8. アイテム作成  
アイテムは監視方法ごとに増やす
例）HTTP Service
<pre>
名前：HTTP service is running
タイプ：シンプルチェック
キー：net.tcp.service[,,80]
アプリケーション：HTTP Service
</pre>
9. アクション（トリガー）作成  
トリガーはテンプレートの作成ルールと同様に、監視方法ごとに作成する
例）死活監視通知
<pre>
名前：死活監視通知
アクションの実行条件：メンテナンスの状態 期間外 メンテナンス、テンプレート = ICMP Ping
アクションの実行内容：ユーザグループ or ユーザ （または両方）に送信
</pre>
10. グラフ作成  
<pre>
テンプレートに対してグラフを作成する
</pre>
11. アクション（ディスカバリ）  
例）BBルータ
<pre>
ディスカバリ名:Auto discovery.PR-500KI.
アクションの実行条件:ディスカバリチェック = PR-500KI: ICMP ping
アクションの実行内容:ホストグループに追加:sample hosts、テンプレートとリンク: ICMP Ping
</pre>
例）自宅サーバ
<pre>
ディスカバリ名:Auto discovery.FUJITSU PRIMERGY.
アクションの実行条件:ディスカバリチェック = FUJITSU PRIMERGY: Zabbixエージェント "Linux"
アクションの実行内容:ホストグループに追加:sample hosts、テンプレートとリンク: ICMP Ping, OS Linux
</pre>

### 3-4. Zabbix通知テスト

監視対象のホストやプロセスを直接落下させても確認できるが、
まずはZabbixサーバ上で通知確認を行うとよい。  
死活監視（ICMP Ping）とサービス監視（TCPポート）は、
Zabbixサーバ上のiptablesでパケットを落とすことでテストできる。  
ターミナルを最低２つ開き、１つはiptablesのパケットカウンタモニタリング用、
もう１つはiptables定義操作用として作業を行う。  

1. パケットカウンタをリセットする
<pre>
iptables -Z
</pre>
2. リアルタイムにiptablesのパケットカウンタを確認する
<pre>
while :; do iptables -nvxL --line-numbers; sleep 1; clear; done
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num      pkts      bytes target     prot opt in     out     source               destination         
1         485    64109 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
2           0        0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
3          12      720 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
4           0        0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
5          34     2176 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80 
6           0        0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW udp dpt:162 
7           0        0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:10050 
8          20     3320 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 
</pre>
3. パケットドロップのルールを追加する
  1. 死活監視の場合  
監視テストを行うホスト（ここでは 192.168.1.62)からの icmp pingをドロップする
<pre>
iptables -I INPUT 1 -p icmp --src 192.168.1.62 -j DROP
</pre>
先ほどのドロップするルールが１行目に追加された
<pre>
while :; do iptables -nvxL --line-numbers; sleep 1; clear; done
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num      pkts      bytes target     prot opt in     out     source               destination         
1           0        0 DROP       icmp --  *      *       192.168.1.62         0.0.0.0/0           
</pre>
カウンタが増えており、パケットがドロップされたことがわかる
<pre>
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num      pkts      bytes target     prot opt in     out     source               destination         
1           3      288 DROP       icmp --  *      *       192.168.1.62         0.0.0.0/0           
</pre>
監視テスト後はルールを削除する  
削除する行を誤ると通信できなくなる可能性があるため注意する  
<pre>
iptables -D INPUT 1
</pre>
  2. サービス監視の場合  
サービス監視の場合も先ほどの死活監視と同様の手順で行う    
ここでは監視テストを行うホスト(ここでは 192.168.1.60)のhttp(80/tcp)に対しての
パケットドロップのみ説明する
<pre>
iptables -I INPUT 1 -p tcp -m tcp --dst 192.168.1.60 --dport 80 -j DROP
</pre>

## 4.運用

### 4-1. Webサーバ(Apache httpd)
* 障害時に一斉にZabbixでグラフやスクリーンを閲覧しようとしてhttpdが落ちた
 - httpdがボトルネックとなる場合は、フロント(Webサーバ)を複数に分け、バック(DBサーバ)を分離するなど対策を取る（httpdのチューニング前提）

### 4-2. DBサーバ(MySQL)
* 気がついたらDBが肥大化してしまった
 - DBがある程度肥大化したら、DBからデータをダンプし、DBを再構築する  
  ※ MySQLのエンジンをinnodbで運用を開始し、データストア(ibdata1)が肥大化してしまった経験あり。  
  ※ bdata1が12GBのときにmysqldumpでダンプを取ったら実データは1.5GB程度だった。 DBに詳しく筆者はZabbixのhousekeeper（古いデータを自動削除する機能)でディスク容量自体が減ると思っていたが、一度肥大化したDBはdelete文で削除してもディスク容量が減らないことを知った。（実際、housekeeperは内部でdelete文を実行し、データを消している）

### 4-3. APLサーバ(Zabbix)