#author("2018-10-07T01:31:42+09:00","default:nowsky","nowsky")
*ZABBIX [#j4037e5d]
[[zabbix:+http://www.zabbix.com/jp/]]
統合監視システム。やろうと思えば、ログとかも収集出来る。
基本は公式のwikiがあるのでそれを見ればわかる。以下参考資料(wiki)
[[zabbix 1.8:+https://www.zabbix.com/documentation/jp/1.8/manual/installation/installation_from_source]]
[[zabbix 2.2:+https://www.zabbix.com/documentation/2.2/manual/installation/install]]
[[zabbix 3.2:+https://www.zabbix.com/documentation/3.2/manual/installation/install]]
[[zabbix 4.0:+https://www.zabbix.com/documentation/4.0/manual/installation/install]]
[[zabbix RPM:+http://www.zabbix.jp/documents/installation/install-rpm]]
~
*インストール [#a234c2d8]
&size(16){&font(b){0. 前提条件};};
-[[zabbix-server>#deb5846c]]
-[[zabbix-proxy>#mec6ad04]]
-[[zabbix-agentd>#t8492ea9]]

以下を前提でメモしてある。
 各IPアドレスは、
 ・zabbix-server = 192.168.1.10
 ・zabbix-proxy  = 192.168.1.20
 ・zabbix-agentd = 192.168.1.10,192.168.11.11
 とする。
~
&size(16){&font(b){1. 前準備};};
予め、必須なミドルウェアを入れておく。
[[Apache>Linux/Source/Apache]]
[[MySQL>Linux/Source/MySQL]]
[[PHP>Linux/Source/PHP]]
ミドルウェアを入れた後にzabbix用ユーザ、グループを作成。
 # groupadd zabbix
 # useradd -g zabbix -d /var/zabbix -s /sbin/nologin zabbix
その後、zabbixで監視する物に対応するライブラリ(snmp-develとか)を突っ込む。
ライブラリ関係までmakeするのだと、切りが無いのでサクッとapt-getなりyumなりするのを推奨。
~
*zabbix-server [#deb5846c]
&size(16){&font(b){2-1. zabbix-serverのビルド};};
公式wikiの通りにソースを調理していく。
zabbix-serverを入れる時は殆どの場合でzabbix-agentdも入れる筈なので一緒に入れておく。
zabbix-agentdのみインストールする場合は[[下記>#t8492ea9]]参照。
 # tar zxvf zabbix-2.2.1rc1.tar.gz
 # cd zabbix-2.2.1rc1
 # ./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --with-mysql --with-net-snmp --with-libcurl --with-libxml2
 # make
 # make install
~
&size(16){&font(b){2-2. zabbix-serverの設定};};
./configureを打つ時にzabbix-serverの設定ファイル保存先を、sysconfdirで指定しても良いのだが、
折角prefix指定をやっているのでシンボリックリンクで対処する。
 # cd /etc
 # ln -s /usr/local/zabbix/etc ./zabbix
 # cd zabbix
 # vi zabbix_server.conf
~
最低限、以下の項目を設定しておく。
&font(b){※設定例(例として、パスワードはzabbix_passにしてある)};
 LogFile=/var/log/zabbix/zabbix_server.log
 LogFileSize=16
 DBHost=127.0.0.1
 DBName=zabbix
 DBUser=zabbix
 DBPassword=zabbix_pass
 DBSocket=/tmp/mysql.sock <- MySQLのsock設定と同じにする
 DBPort=3306 <- MySQLのポート設定と同じにする
 ListenIP=192.168.1.10
 Include=/usr/local/zabbix/etc/zabbix_server.conf.d/
~
&size(16){&font(b){2-3. MySQLの準備};};
zabbix用のDBを作成する前にMySQLのコンフィグをチューニングする。
zabbixはInnoDB方式で書き込んでいく為、普段の設定とは少し違う項目が増える。
あと、zabbixはデータ量が凄く多いのでチューニングをしないとDB容量がすぐGB単位になる。
&font(b){※アイテム数150を毎分取得していくと、一日で20Mバイトは使う。};
詳細はオフィシャルの[[wiki>+https://www.zabbix.com/documentation/jp/1.8/manual/performance_tuning]]を見る事。
一例としてこんな感じにする。
 # vi /etc/my.cnf
 ---
 #DBファイルをテーブル毎に管理する。
 innodb_file_per_table
 #実メモリ容量の50%~70%程度がいいらしい。
 innodb_buffer_pool_size = 1024M
 #HDDの容量に応じて変化させる。32M,64M,128M程度が無難。それ以上だとあまり意味がなくなる。
 innodb_log_file_size = 32M
~
zabbix用にMySQLのユーザとデータベースを作成する。
ユーザのパスワードは、zabbix_server.confに書いた物と同じにする。
もし、MySQLの設定でデータベースのデフォルト文字コードがUTF8になっていないのなら、
データベースを作成する時に文字コードをUTF8指定にして作成する。
 # mysql -u root -p
 Enter password: {rootのパスワード}
 > create database zabbix default character set utf8;
 > grant all on zabbix.* to zabbix identified by 'zabbix_pass';
 > flush privileges;
 > exit;
~
データベースを作ったら、zabbixのソースに付いているSQLテンプレートを流し込んでデフォルトデータを作る。
&font(b){※流し込む順番は以下で固定。};毎回パスワード聞かれるけど、頑張って打ち込んでいく。
 # mysql -u root -p zabbix < {zabbixのソースコード}/database/mysql/schema.sql
 # mysql -u root -p zabbix < {zabbixのソースコード}/database/mysql/images.sql
 # mysql -u root -p zabbix < {zabbixのソースコード}/database/mysql/data.sql
~
&size(16){&font(b){2-4. 起動準備};};
zabbix-server起動スクリプトのコピーとかを行う。
※今回はfedora/CentOS用スクリプトを使用。他のディストリビューションならそれに合わせる。
 # cp {zabbixのソースコード}/misc/init.d/fedora/core5/zabbix_server /etc/init.d/
 # chmod 755 /etc/init.d/zabbix_server
 # chkconfig --add zabbix_server
 # chkconfig zabbix_server on
 
 -----
 
 ※起動スクリプトを修正する。
 ZABBIX_BIN="/usr/local/zabbix/sbin/zabbix_server"
 ZABBIX_PID="/var/run/zabbix"
 
 if [ ! -e ${ZABBIX_PID} ] ; then
     mkdir ${ZABBIX_PID}
     chown  zabbix.zabbix ${ZABBIX_PID}
     chmod 750 ${ZABBIX_PID}
 fi
~
&size(16){&font(b){2-5. Apacheの設定};};
zabbix用にApacheのディレクトリを作成し、extraコンフィグも書く。
説明の為、apacheのDocumentRootを"/var/apache/html"とする。
※セキュリティとかを考慮していないので、WANに公開している鯖でzabbix-serverを構築する時は注意。
 # vi /usr/local/apache/conf/extra/httpd-zabbix.conf
 
 //Apache2.4での書き方
 Alias /zabbix/ "/var/apache/zabbix/"
 <Directory "/var/apache/zabbix">
     Options FollowSymLinks MultiViews ExecCGI
     AllowOverride All
     Require all granted
 </Directory>
 
 //Apache2.2での書き方
 Alias /zabbix/ "/var/apache/zabbix/"
 <Directory "/var/apache/zabbix">
     Options FollowSymLinks MultiViews ExecCGI
     AllowOverride All
     Order Allow,Deny
     Allow from all
 </Directory> 
~
設定を書き換えたらzabbixのPHPを移動させ、apacheの再起動をする。
 # cp {zabbixのソースコード}/frontends/php /var/apache/zabbix
 # chown -R root.www /var/apache/zabbix
 # chmod -R 750 /var/apache/zabbix
 # find /var/apache/zabbix -type f -print | xargs chmod 640
 # /etc/init.d/apache restart
~
&size(16){&font(b){2-6. Webインストール};};
Webブラウザを起動して、"http://[zabbix-serverのIPアドレス]/zabbix/"にアクセスをして、画面の指示に従いつつインストールを完了させる。
途中で、
 ・PHPのモジュールが足りない -> PHPをリビルド
 ・PHPの必要要件(メモリ容量等)が足りない -> /etc/php.iniを書き換え、apache再起動
 ・MySQLに接続出来ない -> MySQLとzabbix-serverの設定を見直す
 ・zabbix.conf.phpを設置出来ない -> 一時的にパーミッションを書き換えるか、手動配置
等を行う必要が出てくる。その時はその都度対応していく。
~
*zabbix-proxy [#mec6ad04]
&size(16){&font(b){3-1. zabbix-proxyのビルド};};
負荷分散目的でzabbixを多段構成とする場合は、zabbix-proxyを間に入れる必要がある。
zabbix-proxyはzabbix-serverと同じくMySQLを利用するので事前にインストールしておく。
また、zabbix-proxyのソースコードはzabbix-serverと同じものを利用する。
 # tar zxvf zabbix-3.2.0.tar.gz
 # cd zabbix-3.2.0
 # ./configure --prefix=/usr/local/zabbix-3.2.0 --enable-proxy --with-mysql --with-net-snmp --with-libcurl --with-libxml2
 # make
 # make install
 # cd /usr/local
 # ln -s /usr/local/zabbix-3.2.0 zabbix
~
&size(16){&font(b){3-2. zabbix-proxyの設定};};
zabbix-serverと同じく、シンボリックリンクを張って対処する。
 # cd /etc
 # ln -s /usr/local/zabbix/etc zabbix
 # cd zabbix
 # vi zabbix_proxy.conf
 
zabbix-proxyのセキュリティを担保する為にパッシブモード[ProxyMode=1]を推奨。
[ProxyOfflineBuffer]が短すぎると、ログがロストする場合がある為、
1週間=168時間程度まで長くしておくのが良い。
 ProxyMode=1 <- パッシブモードで動作
 Server=192.168.1.10 <- zabbix-serverのIPアドレス
 Hostname=zabbix-proxy <- zabbixに登録するzabbix-proxy名
 ListenPort=10051
 LogFile=/var/log/zabbix/zabbix_proxy.log
 LogFileSize=16
 DBHost=127.0.0.1
 DBName=zabbix-proxy
 DBUser=zabbix-proxy_user
 DBPassword=zabbix-proxy_pass
 DBSocket=/tmp/mysql.sock <- MySQLのsock設定と同じにする
 DBPort=3306 <- MySQLのポート番号と同じにする
 ProxyLocalBuffer=24
 ProxyOfflineBuffer=168
 ListenIP=192.168.1.20
 Include=/usr/local/zabbix/etc/zabbix_proxy.conf.d/*.conf
~
&size(16){&font(b){3-3. MySQL};};
zabbix-proxy用のInnoDB設定は、zabbix-serverと同じなので割愛。
zabbix-proxyのDBに流し込むSQLテンプレートは&font(b){schema.sqlだけ};流し込む。
serverと同じく、images/dataも流し込むとエラーが出力され、proxyが起動出来なくなる。
 # mysql -u root -p
 Enter password: {rootのパスワード}
 > create database zabbix-proxy default character set utf8;
 > grant all on zabbix-proxy.* to zabbix-proxy_user identified by 'zabbix-proxy_pass';
 > flush privileges;
 > exit;
 ---
 # mysql -u root -p zabbix-proxy < {zabbixのソースコード}/database/mysql/schema.sql
~
&size(16){&font(b){3-4. 起動準備};};
zabbix-proxyの起動スクリプトは存在しないので、zabbix-serverの起動スクリプトを再利用する。
 # cd /etc/init.d
 # cat zabbix_server | sed -e 's/_server/_proxy/g' -e 's/Server/Proxy/g' > zabbix_proxy
 # chmod 755 /etc/init.d/zabbix_proxy
 # chkconfig --add zabbix_proxy
 # chkconfig zabbix_proxy on
 # /etc/init.d/zabbix_proxy start
~
*zabbix-agentd [#t8492ea9]
&size(16){&font(b){4-1. zabbix-agentdのビルド};};
ソースコードはzabbix-serverと同じ。
 # tar zxvf zabbix-2.2.1rc1.tar.gz
 # cd zabbix-2.2.1rc1
 # ./configure --prefix=/usr/local/zabbix --enable-agent
 # make
 # make install
~
&size(16){&font(b){4-2. zabbix-agentdの設定};};
事前に、zabbix-serverをインストールしていて、シンボリックリンクを張ってあった場合は再度張らないでOK
 # cd /etc
 # ln -s /usr/local/zabbix/etc ./zabbix
 # cd zabbix
 # vi zabbix_agentd.conf
~
最低限、以下の項目を設定しておく。
 ※設定例
 //IPアドレスが"192.168.1.10"のマシンを想定
 LogFile=/var/log/zabbix/zabbix_agentd.log
 ListenIP=192.168.1.10
 Server=192.168.1.10
 ServerActive=192.168.1.10
 Hostname={ホストネームを英語で書く}
 Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/
 
 //IPアドレスが"192.168.1.11"のマシンを想定
 LogFile=/var/log/zabbix/zabbix_agentd.log
 ListenIP=192.168.1.11
 Server=192.168.1.10
 ServerActive=192.168.1.10
 Hostname={ホストネームを英語で書く。他と被らない事}
 Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/
~
&size(16){&font(b){4-3. 起動準備};};
zabbix-agentd起動スクリプトのコピーを行う。
※今回はfedora/CentOS用スクリプトを使用。他のディストリビューションならそれに合わせる。
 # cp {zabbixのソースコード}/misc/init.d/fedora/core5/zabbix_agentd /etc/init.d/
 # chmod 755 /etc/init.d/zabbix_agentd
 # chkconfig --add zabbix_agentd
 # chkconfig zabbix_agentd on
 
 -----
 
 ※起動スクリプトの中身を修正する。以下は一例。
 ZABBIX_BIN="/usr/local/zabbix/sbin/zabbix_agentd"
 ZABBIX_PID="/var/run/zabbix"
 
 if [ ! -e ${ZABBIX_PID} ] ; then
     mkdir ${ZABBIX_PID}
     chown  zabbix.zabbix ${ZABBIX_PID}
     chmod 750 ${ZABBIX_PID}
 fi
~
*インストール後のチューニング [#c65254bd]
後は、zabbix-server,zabbix-agentdの再起動テストや、
マシンごとリブートした時に正常稼働するかのチェックを行っていく。
負荷が結構高いので、いらないテンプレートは無効にした方が良い
~
&size(16){&font(b){5-1. ログローテート};};
zabbix用のログローテートを行わないと、ログが肥大化していくので注意。
 # vi /etc/logrotate.d/zabbix
 /var/log/zabbix/*.log {
     missingok
     notifempty
     sharedscripts
     create 0664 zabbix zabbix
 }
 
 ※OSごと再起動させて確認をする。
 # reboot
~
&size(16){&font(b){5-2. zabbixのグラフ文字化け対策};};
インストール直後だとグラフ表示用のフォントが入っていないので、
OSにインストール済みのフォントへリンクして読み込む様にする。
フォントに2バイト文字データが入っていればグラフで2バイト文字の表示をするがPゴシックが無難。
 # cd /var/apache/zabbix/fonts
 # ln -s /usr/share/fonts/ipa-pgothic/ipagp.ttf ./ipagp.ttf
 # vi ../include/defines.inc.php
 ---
 #以下の項目に書き換える
 define('ZBX_GRAPH_FONT_NAME', 'ipagp'); //font file name
 ...
 define('ZBX_FONT_NAME', 'ipagp');
~
&size(16){&font(b){5-3. zabbixのグラフ標準表示時間の設定};};
標準だと、zabbixのグラフは最大2年間・最小とデフォルトが1時間を表示する設定になっている。
この状態だと都合によっては見づらくなるので、PHPを書き換えて表示時間の調整を行う。
設定する単位は秒になる(1時間=3600・1日=86400)。
 # vi /var/apache/zabbix/include/defines.inc.php
 ---
 #最小時間
 define('ZBX_MIN_PERIOD', 3600); // 1 hour
 #最大表示時間
 define('ZBX_MAX_PERIOD', 63072000); // the maximum period for the time bar control, ~2 years (2 * 365 * 86400)
 #デフォルトの表示時間
 define('ZBX_PERIOD_DEFAULT', 3600); // 1 hour
 
zabbix-4.0以降はグラフのタイムバーが廃止となった為、指定方法が「FROM-TO」の決め打ちとなる。
1日(24時間)の表示をデフォルトにしたい場合、defines.inc.phpを下記の通り書き換える。
 define('ZBX_PERIOD_DEFAULT_FROM', 'now-24h');
 define('ZBX_PERIOD_DEFAULT_TO', 'now');
~
&size(16){&font(b){5-4. DB領域の圧縮};};
監視する端末が増えると、zabbixがMySQLに書き込むデータ量も増えていき、
結果としてディスクI/O不足による高負荷状態になる事がある。
I/O待ちを防ぐには、テーブルを圧縮しディスクI/O負荷をCPU負荷に転換すれば対処出来る。

 ・MySQLの準備
 ※innodbの値は環境に合わせて変更する
 
 # mysqldump -u root -p -x --all-databases > mysql_dump.sql
 # /etc/init.d/mysql stop
 # rm ${MySQL_datadir}/ib_logfile* ${MySQL_datadir}/ibdata*
 # vi /etc/my.cnf
 ---
 innodb_file_format        = Barracuda
 innodb_buffer_pool_size   = 2048M
 innodb_log_files_in_group = 2
 innodb_log_file_size      = 64M
 innodb_log_buffer_size    = 64M
 ---
 # /etc/init.d/mysql start

 ・テーブル形式の確認
 $ mysql -u root -p
 mysql> use information_schema;
 mysql> select table_name, engine from tables where table_schema = "zabbix";
 
 +-----------------------+--------+
 | table_name            | engine |
 +-----------------------+--------+
 | acknowledges          | InnoDB |
 | actions               | InnoDB |
 | alerts                | InnoDB |
 |                       |        |
 | ...                   | ...    |
 |                       |        |
 | users_groups          | InnoDB |
 | usrgrp                | InnoDB |
 | valuemaps             | InnoDB |
 +-----------------------+--------+

 ・テーブル圧縮(InnoDBの場合)
 mysql> use zabbix;
 mysql> alter table acknowledges ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
 mysql> alter table actions      ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
 mysql> alter table alerts       ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
 mysql> ...
 mysql> alter table users_groups ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
 mysql> alter table usrgrp       ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
 mysql> alter table valuemaps    ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
 
 mysql> alter table acknowledges engine InnoDB;
 mysql> alter table actions      engine InnoDB;
 mysql> alter table alerts       engine InnoDB;
 mysql> ...
 mysql> alter table users_groups engine InnoDB;
 mysql> alter table usrgrp       engine InnoDB;
 mysql> alter table valuemaps    engine InnoDB;

 ・テーブル圧縮(MyISAMの場合)
 mysql> use zabbix;
 mysql> alter table acknowledges engine MyISAM;
 mysql> alter table actions      engine MyISAM;
 mysql> alter table alerts       engine MyISAM;
 mysql> ...
 mysql> alter table users_groups engine MyISAM;
 mysql> alter table usrgrp       engine MyISAM;
 mysql> alter table valuemaps    engine MyISAM;
~
&size(16){&font(b){5-5. windowsのトラフィック計測};};
-[[参考情報:ネットワークトラフィックの値が取れません。>+http://www.zabbix.jp/node/1018]]
 
windows機のNWトラフィックを計測するには、zabbixエージェントとperf_counter()を併用すれば取得出来る。
しかし、NICを2つ積んでいる場合等により、NIC名に"#"が含まれている場合、
通常の名前指定では取得出来ない為、トラフィック取得先の指定に工夫が必要になる。

 ・windows機のNIC名を取得
 cmd> typeperf -qx
 -> '#'が'_'になったり、'()'が'[]'になったりして出力される
 -----
 ・zabbixテンプレート
 タイプ:Zabbixエージェント
 キー:perf_counter[\Network Interface({$ETH_NIC})\Bytes Received/sec]
 -> "${ETH_NIC}"やホストマクロにNIC名を入れる

 ・例
 Windows:[ネットワークとインターネット] -> [ネットワーク接続] -> [イーサネットのプロパティ]
        ->"Microsoft Hyper-V ネットワーク アダプター #2"
 zabbix :[設定] -> [テンプレート] -> [アイテム] -> [作成したトラフィック計測アイテム]
        ->"perf_counter[\Network Interface({$ETH_NIC})\Bytes Received/sec]"
        :[設定] -> [ホスト] -> [トラフィック計測するホスト] -> [マクロ]
        ->"Microsoft Hyper-V ネットワーク アダプター _2"