ZabbixによるNetBSDシステム監視


  1. Zabbixについて
  2. インストール
    1. sysutils/zabbixのインストール
    2. sysutils/zabbix-frontendのインストール
    3. Zabbix Agentの設定と起動
    4. Zabbix Serverの設定と起動
    5. Zabbix Webフロントエンドの設定

Zabbixについて

ZabbixはZabbix LLC.という企業主体で開発されているFLOSS(GPLv2)の監視ソフトウェアです。バックエンドはC言語、フロントエンドはPHPで実装されています[1]。

Zabbixの監視システムをおおまかに図にすると図1のようになります。

zabbix basic monitoring system
図1: 基本的なZabbix監視システム。矢印はなにかしらのデータのやりとりがあることを示しています。

図1に示したとおりZabbixはServer-Agentモデルの監視をおこないます。監視対象のシステムにZabbix Agentがインストールされ、Zabbix Serverは各Zabbix Agentへ監視項目を問い合わせ、返ってきたデータをデータベースに格納します[2]。取得した監視データはZabbix Webフロントエンドから確認でき、グラフにプロットすることも可能です。

Zabbix LLC.からはGNU/Linuxディストリビューション向けにServerおよびAgentのパッケージが提供されており、FreeBSD・OpenBSD・MacOS・Windows・AIX・HP-UXなどの環境に対してはAgentのパッケージのみ提供されています。NetBSD向けパッケージは提供されておらず、pkgsrc(7)からsysutils/zabbixパッケージをインストールする必要があります。Zabbix Webフロントエンドは別途sysutils/zabbix-frontendパッケージをインストールしなければなりません。

インストール

sysutils/zabbixのインストール

sysutils/zabbixパッケージをインストールします。このパッケージにはZabbix Agent・Zabbix Server・Zabbix Proxyが含まれています。pkgsrc-2019Q3時点ではZabbix 4.0.9が提供されるようですが、4.0.9ではZabbix側のNetBSD依存のコードが古くビルドに失敗します。そこで、このパッケージは修正パッチがあるpkgsrc-currentブランチを使ってください。

また、Zabbix Serverを動かすホストと同じホストでデータベースも動かす場合は、別途データベースを用意します。標準ではsysutils/zabbixパッケージはdatabase/postgresql95-clientパッケージに依存しているため、database/postgresql95-serverをインストールするといいでしょう(これより新しいバージョンのPostgreSQLでは動作未確認です。おそらく動くと思います)。

cd /usr/pkgsrc/sysutils/zabbix
cvs update -dP -A
make install clean clean-depends
cd /usr/pkgsrc/database/postgresql95-server
make install clean clean-depends

必要なデーモンのRCファイルを用意します。ここではPostgreSQLとZabbix AgentおよびZabbix Serverにします。

cp /usr/pkg/share/examples/rc.d/pgsql /etc/rc.d
cp /usr/pkg/share/examples/rc.d/zabbix_agentd /etc/rc.d
cp /usr/pkg/share/examples/rc.d/zabbix_server /etc/rc.d

/etc/rc.confに以下を追記します。

pgsql=YES
zabbix_agentd=YES
zabbix_server=YES

sysutils/zabbix-frontendのインストール

Zabbix Webフロントエンドを使うにはsysutils/zabbix-frontendパッケージをインストールします。pkgsrc-2019Q3ではこのパッケージはPHP 7.1に依存していますが、Apache上でPHP 7のスクリプトを実行するにはモジュールではなくCGIを使うように標準の設定が変更されました。そこでPHPのFastCGI実装であるwww/php-fpmパッケージも一緒にインストールしなければなりません。

cd /usr/pkgsrc/sysutils/zabbix-frontend
make install clean clean-depends
cd /usr/pkgsrc/www/php-fpm
make install clean clean-depends

Webサーバとphp-fpmのRCファイルを用意します。

cp /usr/pkg/share/examples/rc.d/apache /etc/rc.d
cp /usr/pkg/share/examples/rc.d/php_fpm /etc/rc.d

/etc/rc.confに以下を追記します。

apache=YES
php_fpm=YES

Zabbix Agentの設定と起動

Zabbix Agentの設定ファイルは/usr/pkg/etc/zabbix_agentd.confです。基本的には以下の設定項目を確認します。

LogFile
Zabbix Agentのログファイルのパスです。
Server
Zabbix ServerのDNS名かIPアドレスです。
ServerActive
Active Checkの監視データを送信する先のZabbix ServerのDNS名かIPアドレスです。基本的にはServerの設定と同じになるかと思われます。
Hostname
Zabbix Agentのホスト名です。Zabbix AgentがインストールされているOSのホスト名ではありません。

ここでは次のように設定をしました。なお、/var/log/zabbixディレクトリは新規作成し、ディレクトリのオーナとグループをzabbix.zabbixに変更しています。

LogFile=/var/log/zabbix/zabbix_agentd.log
Server=127.0.0.1
ServerActive=127.0.0.1
Hostname=Zabbix server

設定後はZabbix Agentデーモンを実行してください。

service zabbix_agentd start

Zabbix Serverの設定と起動

ここではZabbix Serverとデータベースを動かすホストが同一であるとします。NetBSD標準の設定ではセマフォ(semaphore)が足りなくなりZabbix Serverかデータベースのどちらかが動きません。そこでsysctl(8)からシステム中のセマフォの数を増やす設定をします。実際の数字はトライアンドエラーで調整してください。

sysctl -w kern.ipc.semmns=80

PostgreSQLを起動します。

service pgsql start

PostgreSQLにZabbix Server用のユーザとデータベースを作成します。database/postgresql95-serverパッケージは標準ではpgsqlユーザがPostgreSQLの管理者なようです。ここでzabbixユーザに設定したパスワードは後で利用します。

sudo -u pgsql createuser --pwprompt zabbix
sudo -u pgsql createdb -O zabbix zabbix

データベース作成後はZabbix用のデータベースを初期化します。初期化用のSQL文はパッケージで提供されています。

sudo -u zabbix psql zabbix < /usr/pkg/share/zabbix/schema.sql
sudo -u zabbix psql zabbix < /usr/pkg/share/zabbix/images.sql
sudo -u zabbix psql zabbix < /usr/pkg/share/zabbix/data.sql

データベースの設定完了後はZabbix Serverの設定ファイル/usr/pkg/etc/zabbix_server.confを編集します。確認すべき設定項目は以下のとおりです。

LogFile
Zabbix Serverが出力するログファイルのパスです。
DBName
Zabbix Serverが使うデータベース名です。本稿の手順に従った場合、標準のzabbixのままで問題ありません。
DBUser
Zabbix Serverがデータベースへアクセスするためのユーザ名です。本稿の手順に従った場合、標準のzabbixのままで問題ありません。
DBPassword
createuserコマンドを実行したときにzabbixユーザに設定したパスワードを設定します。

設定後はZabbix Serverデーモンを実行してください。

service zabbix_server start

Zabbix Webフロントエンドの設定

Zabbix Webフロントエンドを使うには、Apacheとphp-fpmの設定が必要です。はじめにphp-fpmの設定をおこないます。/usr/pkg/etc/php-fpm.d/zabbix.confを新規作成し、次のように編集してください。

[zabbix]
user = www
group = www

listen = /var/run/php-fpm_zabbix.sock
listen.owner = www
listen.group = www
listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

php_value[session.save_handler] = files

php_value[max_execution_time] = 300
php_value[memory_limit] = 512M
php_value[post_max_size] = 128M
php_value[upload_max_filesize] = 128M
php_value[max_input_time] = 300
php_value[max_input_vars] = 10000
php_value[always_populate_raw_post_data] = -1
php_value[date.timezone] = Asia/Tokyo

つぎにApacheの設定をおこないます。/usr/pkg/etc/httpd/httpd-php.confを新規作成し、以下のように編集してください。


# /usr/pkg/etc/httpd/httpd-php.conf
AddType text/html .php
DirectoryIndex index.php
SetHandler application/x-httpd-php

次に/usr/pkg/etc/httpd/httpd-zabbix.confを新規作成し、以下のように編集してください。

# /usr/pkg/etc/httpd/httpd-zabbix.conf
Alias /zabbix /usr/pkg/share/zabbix/php

<Directory "/usr/pkg/share/zabbix/php">
	Options -FollowSymLinks
	AllowOverride Limit
	<LimitExcept POST GET>
		Order deny,allow
		Deny from all
	</LimitExcept>
	<IfModule mod_authz_core.c>
		Require all granted
	</IfModule>
	<IfModule !mod_authz_core.c>
		Order allow,deny
		Allow from all
	</IfModule>
	<files *.php>
		SetHandler application/x-httpd-php
		SetHandler "proxy:unix:/var/run/php-fpm_zabbix.sock|fcgi://localhost"
	</files>
</Directory>

<Directory ~ "^/usr/pkg/share/zabbix/php/(conf|api|include|local)/">
	<IfModule mod_authz_core.c>
		Require all denied
	</IfModule>
	<IfModule !mod_authz_core.c>
		Order deny,allow
		Deny from all
	</IfModule>
	<files *.php>
		<IfModule mod_authz_core.c>
			Require all denied
		</IfModule>
		<IfModule !mod_authz_core.c>
			Order deny,allow
			Deny from all
		</IfModule>
	</files>
</Directory>

最後に/usr/pkg/etc/httpd.confを編集します。以下の差分のように変更してください(僕がCGIアプリケーションを走らせるときにした変更が一部残っていますが気にしないでください)。

--- /usr/pkg/share/examples/httpd/httpd.conf	2019-11-17 10:53:36.000000000 +0900
+++ httpd/httpd.conf	2019-11-17 11:56:43.538984425 +0900
@@ -127,11 +123,11 @@
 LoadModule setenvif_module lib/httpd/mod_setenvif.so
 LoadModule version_module lib/httpd/mod_version.so
 #LoadModule remoteip_module lib/httpd/mod_remoteip.so
-#LoadModule proxy_module lib/httpd/mod_proxy.so
+LoadModule proxy_module lib/httpd/mod_proxy.so
 #LoadModule proxy_connect_module lib/httpd/mod_proxy_connect.so
 #LoadModule proxy_ftp_module lib/httpd/mod_proxy_ftp.so
 #LoadModule proxy_http_module lib/httpd/mod_proxy_http.so
-#LoadModule proxy_fcgi_module lib/httpd/mod_proxy_fcgi.so
+LoadModule proxy_fcgi_module lib/httpd/mod_proxy_fcgi.so
 #LoadModule proxy_scgi_module lib/httpd/mod_proxy_scgi.so
 #LoadModule proxy_uwsgi_module lib/httpd/mod_proxy_uwsgi.so
 #LoadModule proxy_fdpass_module lib/httpd/mod_proxy_fdpass.so
@@ -270,7 +266,7 @@
 # is requested.
 #
 <IfModule dir_module>
-    DirectoryIndex index.html
+    DirectoryIndex index.html index.cgi index.php
 </IfModule>
 
 #
@@ -523,3 +519,6 @@
 SSLRandomSeed connect builtin
 </IfModule>
 
+IncludeOptional etc/httpd/httpd-zabbix.conf
+IncludeOptional etc/httpd/httpd-php.conf
+IncludeOptional etc/httpd/httpd-mpm.conf

最後に/usr/pkg/share/zabbix/php/conf/zabbix.conf.phpを次のように編集します。


<?php
// Zabbix GUI configuration file.
global $DB, $HISTORY;

$DB['TYPE']				= 'POSTGRESQL';
$DB['SERVER']			= 'localhost';
$DB['PORT']				= '0';
$DB['DATABASE']			= 'zabbix';
$DB['USER']				= 'zabbix';
// PostgreSQLのzabbixユーザのパスワードを書く
$DB['PASSWORD']			= '設定したパスワード';
// Schema name. Used for IBM DB2 and PostgreSQL.
$DB['SCHEMA']			= '';

$ZBX_SERVER				= 'localhost';
$ZBX_SERVER_PORT		= '10051';
$ZBX_SERVER_NAME		= '';

$IMAGE_FORMAT_DEFAULT	= IMAGE_FORMAT_PNG;

// Uncomment this block only if you are using Elasticsearch.
// Elasticsearch url (can be string if same url is used for all types).
//$HISTORY['url']   = [
//		'uint' => 'http://localhost:9200',
//		'text' => 'http://localhost:9200'
//];
// Value types stored in Elasticsearch.
//$HISTORY['types'] = ['uint', 'text'];

php-fpmとApacheのデーモンを動かします

service php_fpm start
service apache start

Webブラウザから 127.0.0.1/zabbix へアクセスします。標準ではユーザAdminのパスワードには「zabbix」が設定されています。

Zabbix web frontend login page
図2: Zabbix Webフロントエンドのログインページ。 標準ではAdmin/zabbixでログインできます。
Zabbix web frontend dashboard
図3: Zabbix Webフロントエンドにログインした直後のダッシュボードページ。

後注

  1. Zabbix 4.4からZabbix AgentをGo言語で再実装したZabbix Agent 2がリリースされました。
  2. ServerからAgentへ向けた監視データの問い合わせをPassive Checkと呼びます。逆にZabbix AgentからZabbix Serverへ向けて監視データを送信する場合はActive Checkと呼びます。