【Zabbix】統合監視入門

## 【Zabbix】統合監視入門

### この記事でわかる・できること

- WindowsにLinuxの仮想環境を作成してZabbixを構築

### この記事の対象者

- 統合監視を始めたい人

### 動作環境・使用するツールや言語

- Windows Server 2019 Standard
- Zabbix 6.0 LTS
- Ubuntu 22.04

### はじめに

統合監視ではサーバやネットワーク機器、ソフトウェアなどの状況を一元管理して、死活監視、パフォーマンス監視、syslog監視など様々な監視を行います。
Zabbixは人気のあるオープンソースの監視ミドルウェアです。
ただし2024年7月現在、Windowsは監視対象としてエージェントをインストールすることはできますが、サーバとしてはインストールできません。
Windows上で動かしたい場合は仮想化を行う必要があります。方法は色々ありますが、WSL（Windows SubSystem for Linux)が簡単です。

### Windows上にLinux環境を構築

#### WSLの有効化
コントロールパネルの「Windowsの機能の有効化または無効化」から　「Linux用Windowsサブシステム」にチェックを入れて再起動します。
もしこれがエラーになる場合はBIOSで仮想化機能が有効になっていない可能性があります。この場合、DockerやVirtual Boxなど他の仮想化ソフトも使えません。
BIOSから有効化してください。

#### WSLのインストール
コマンドプロンプトかPowerShellを管理者権限で起動します。
Windowsのバージョンによっては単純に
```
wsl --install
```
でインストールされますが、今回の環境であるWindows Server 2019 Standardでは--install自体が使えません。
なおこの環境では関係ありませんが、WSLにはバージョン１と２があって、１だとsystemctlが使えないので後々zabbixを自動起動することが面倒になるため、可能であれば２にした方がよいです。（デフォルトで１がインストールされる場合もあるようです）
Microsoftの公式サイトからパッケージをダウンロードする必要があります。拡張子がappxになっていて、公式サイトでは色々とコマンドが書いてありますが、環境によってはエラーになって通らない場合もあります。
やることは拡張子をzipにして解凍するだけです。ディストリビューションによるかもしれませんが、appxを解凍するとさらにx64やARM64などのappxに分かれているので、それをさらにzipにして解凍します。
今回はUbuntu22.04のx64を選択しました。
最終的にexeが出てくるので、それを実行することでWSLおよびLinux環境が起動します。
最初にユーザ名とパスワードを聞かれるので設定します。
rootのパスワードも設定しておきましょう。
```
sudo passwd root
```
#### Linuxの設定

##### DNS
後々日本語パッケージをインストールする時に名前解決に失敗する場合があります。
/etc/resolve.confを編集してNameServerを8.8.8.8（GoogleのDNSサーバ）にしておきましょう。

##### Zabbixのダウンロード、インストール
Zabbixの公式サイトのダウンロードページでバージョンやOSを指定すると必要なコマンドを表示してくれます。
今回では下記の通りとしました。
　zabbix version：6.0 LTS
　OS：Ubunts
　OSバージョン：22.0.4
　zabbix component：Server,Frontend,Agent
　Database：MySQL
　Web Server：Apache
表示されたコマンドをコピペで実行しますが、データベースはインストールされないので自分でインストールします。
```
apt install mysql-server
```
WSL2があるなら
```
systemctl start mysql
systemctl enable mysql
```
で自動起動できますが、今回は無いのでとりあえず
```
service mysql start
```
で手動起動しておきます。apache2も起動しておいてください。

##### 日本語パッケージのダウンロード
```
apt -y install language-pack-ja-base language-pack-ja ibus-mozc
```
DNSサーバを8.8.8.8などにしていないとエラーになる場合があります。

#### zabbixのインストール
http://localhost/zabbix
　にアクセスして画面の指示に従いインストールします。
 インストール後は初期アカウントで
ユーザ名：Admin
パスワード：zabbix
でログインできます。
#### ファイアウォールの80番ポートの開放
他の端末からアクセスできるようにします。
コントロールパネルからWindows Defenderファイアウォールの設定で「受信の規則」から80番ポートを開放します。

#### ポートフォワーディング
他の端末から、Windows上の80番ポートに来たアクセスを、Zabbixが稼働しているLinuxの80番ポートに転送する必要があります。Linux上でifconfigを実行してIPアドレスを確認してください。WinodwsとIPアドレスが異なる場合はポートフォワーディングを設定します。IPアドレスが同じ場合は設定すると繋がらなくなるので設定しないでください。（Windows自体を仮想マシン上で実行していると同じになる場合があるようです）
管理者権限でPowerShellかコマンドプロンプトを起動します。
netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=【LinuxのIPアドレス】

#### agentのインストール
agentは無くても監視できますが、入れておいた方が幅広い設定が可能です。
agentをダウンロードして監視対象のサーバにインストールします。
ポートの開放などはインストールの過程で実行してくれます。
エージェントを入れる場合はサーバのIPアドレスを指定しますが、これはWindows側のIPアドレスを設定します。

### Zabbixの設定
#### ホスト作成
設定⇒ホスト⇒右上の「ホストの作成」でホストを作成できます。
エージェントをインストールしたサーバはインタフェースのタイプを「エージェント」にしてIPアドレスを指定します。
基本的に何かを作成するときは右上にあります。
画面によっては見切れているのでスクロールする必要があります。
ホストはいずれかのホストグループに所属させる必要があります。
ホストを作成すると一覧に表示されますが、エージェントの状態はまだ無効（赤色）になっています。
１つ以上監視項目を作って監視させなければ有効（緑色）になりません。
#### テンプレート
テンプレートを作成して監視項目を登録すればまとめてホストに登録できます。
既存のテンプレートも色々あるのでそれを使ってもいいです。
#### アイテム、トリガー
アイテムが監視項目、トリガーがアラートを出す条件です。
構文があるので随時調べて設定します。
テンプレートから改造してもいいです。
#### ディスカバリ
例えばディスク使用率は本来ＣドライブとかＦドライブとか指定する必要がありますが、自動で見つけてもらう機能があります。
それがディスカバリです。
例えば「vfs.fs.size[C:,pused]という構文でCドライブのディスク使用率を見ていますが、ディスカバリルールとして「vfs.fs.size{#FSNAME},pused]とすると各ドライブを見つけてくれます。
ディスカバリは他にもネットワークのIPアドレスの範囲からネットワーク機器を発見するようなこともできます。
#### メール通知
管理⇒メディアタイプ⇒Email(HTML)で設定します。
例えばMicrosoft365のoutlookの場合は以下のようになります。
　SMTPサーバ：smtp.offie365.com
　ポート番号：587
　SMTP hello：ドメイン名（メールアドレスの@より後ろ）
　送信元メールアドレス：【メールアドレス】
　接続セキュリティ：STARTTLS
　認証：ユーザ名とパスワード
　ユーザ名：【メールアドレス】
　メッセージフォーマット：HTML
メディアタイプのページで右にスクロールすると送信テストができます。

管理⇒ユーザー⇒Admin⇒メディアタブでEmail(HTML)と紐づけます。

設定⇒アクション⇒トリガーアクションでReport problems to Zabbix administratorsをクリックし、有効にチェックを入れておきます。
実行内容のところにメッセージを送信する旨が記載されています。

以上でトリガーに引っかかったらメールが送られてくるはずです。

### Zabbix自体の監視
監視対象のサーバからZabbixのプロセス「zabbix_server」が落ちていないか監視しましょう。監視対象のサーバも死活監視すれば相互監視になります。
```powershell:
$var = Get-Process -ComputerName 【Zabbixサーバのホスト名】 | out-string -Stream | select-string "zabbix_server"

if($var -eq $null){

	Write-Host '異常あり'
	
	# Office 365 の認証情報
	$o365User = '【ユーザ名】';
	$o365Pass = '【パスワード】'
	# 差出人
	$from    = '【メールアドレス】';
	# 宛先
	$to      = '【メールアドレス】';
	# メールのタイトルと本文
	$subject = 'zabbixアラート';
	$body    = 'zabbix-serverが起動していません。';

	# MailMessage インスタンス作成
	$msg = New-Object System.Net.Mail.MailMessage($from, $to, $subject, $body);

	# Office 365 の SMTP サーバーを設定して SmtpClient インスタンスを作成
	$SMTPClient = New-Object Net.Mail.SmtpClient("smtp.office365.com", 587) ;

	# SSL を True に設定
	$SMTPClient.EnableSsl = $true;

	# Office 365 への認証
	$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($o365User, $o365Pass);

	# メール送信
	$SMTPClient.send($msg);
	
}
else{
	Write-Host '異常なし'
}

```
このPowershellを管理者で実行するバッチを作成し、タスクスケジューラに登録して定期実行します。
```bat
@echo off
cd C:\zabbix_monitor
echo 開始 > mail_send.log
echo %date%%time% >> mail_send.log
powershell -NoProfile -ExecutionPolicy Unrestricted .\mail_send.ps1 >> mail_send.log
echo 完了 >> mail_send.log
exit
```
なおZabbixはクラスタ構成にすることもできますが、データベースは共有しなければならないようです。

### Zabbixサーバが落ちた時
サーバを起動してWSLまたはLinuxのEXEを再度実行します。
サービスが自動起動になっていない場合は諸々起動します。
```
service mysql start
service apache2 start
service zabbix-server start
service zabbix-agent start
```
### （2024/08/20 追記）自動起動の方法
タスクスケジューラにトリガ「スタートアップ時」で下記の内容のバッチを登録すればwindowsを起動した時に自動起動します。
wslコマンドのhelpを見ればわかりますが、--でLinux側に対してコマンドを渡すことができます。
```
wsl -u root -- service mysql start
wsl -u root -- service apache2 start
wsl -u root -- service zabbix-server start
wsl -u root -- service zabbix-agent start
```
### （2024/08/20 追記）Linux環境の構築をはじめからやり直したい場合
powershellから
```
wslconfig /u ubuntu
```
で登録解除してフォルダごと削除します。

### （2024/08/23 追記）画面に異常が発生する場合
zabbixのプロセスが落ちていなくても管理画面の表示に異常が発生する場合があります。
phpのメモリ上限を増やした方がよいでしょう。
php_value memory_limit
のデフォルトが128Mになっているので増やします。
私の環境では/etc/zabbix/apache.conf
にありました。