Pexelsのcottonbroによる写真

Zabbixサーバーで使うミドルウェアをまるごと監視してみよう

Apache HTTP Server,Linux,PHP,PostgreSQL,Zabbix

こんにちは。プラットフォーム技術部の佐藤(賢)です。

突然ですが皆さん、Zabbixサーバー自身の監視やってますか?
標準的なインストール状態だと「Zabbix server」というホストが登録されて、Zabbixサーバーの内部状態やZabbixエージェントによるOS監視がおこなわれるようになっていますので、そのまま使われている方も多いのではないでしょうか。

ただ、Zabbixサーバー自身の監視をおろそかにすると、監視対象が増えサーバー負荷が上がっていても気づかず、ある日突然問題発生となる恐れもありますよね。

今回はZabbixサーバーを構築すると導入されているテンプレートを使って、Zabbixサーバーで使われるミドルウェアのApache HTTP ServerとPHP-FPM、そしてPostgreSQLの監視をおこなってみたいと思います。

Zabbixサーバー構成

今回検証で用いた構成は以下のとおりです。

  • Zabbixサーバー用EC2インスタンス:Rocky Linux 8.4
  • データベース:Aurora RDS for PostgreSQL(エンジンバージョン13.3)

インストールするZabbixのバージョンはせっかくですのでリリース間近の6.0.0(執筆時点でのバージョンは6.0.0aplha4)でやってみましょう!

Zabbixサーバー構築

Zabbixサーバーの構築自体は公式サイトのダウンロードページ記載の手順で進めます。一部Auroraで必要になる手順も含んでいますが、さくっとやっちゃいましょう。

Zabbixリポジトリーのインストール

$ sudo rpm -Uvh https://repo.zabbix.com/zabbix/5.5/rhel/8/x86_64/zabbix-release-5.5-1.el8.noarch.rpm
$ sudo dnf clean all

Zabbixサーバー、フロントエンド、エージェントのインストール

$ sudo dnf install -y zabbix-server-pgsql zabbix-web-pgsql zabbix-apache-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent

PostgreSQLクライアントのインストール

Auroraのエンジンバージョンに合わせてPostgreSQLクライアントの13をインストールします。

$ sudo dnf module install -y postgresql:13/client

PostgreSQLデータベース作成

Auroraのホスト名は繰り返し入力が面倒なので変数に設定して進めます。Auroraのマスターユーザーはpostgresです。

$ export PGHOST={Auroraのエンドポイント名}
$ export PGPORT=5432
$ createuser -h $PGHOST -U postgres -W --pwprompt zabbix
$ echo "GRANT zabbix TO postgres" | psql -h $PGHOST -U postgres -W
$ createdb -h $PGHOST -U postgres -W -O zabbix zabbix
$ zcat /usr/share/doc/zabbix-sql-scripts/postgresql/create.sql.gz | psql -h $PGHOST -U zabbix -W zabbix

GRANT設定はAuroraの場合に必要となる手順です。

Zabbixサーバーのデータベース接続設定

$ sudo cp -p /etc/zabbix/zabbix_server.conf{,.rpmorig}
$ sudo tee -a /etc/zabbix/zabbix_server.conf <<EOF
DBHost=$PGHOST
DBPort=$PGPORT
DBPassword={zabbixユーザーのパスワード}
EOF

PHP-FPMの設定

デフォルトのwwwプールは不要なので無効にします。

$ sudo mv /etc/php-fpm.d/www.conf{,.rpmorig}

zabbixプールにタイムゾーンを設定します。

$ sudo cp -p /etc/php-fpm.d/zabbix.conf{,.rpmorig}
$ sudo tee -a /etc/php-fpm.d/zabbix.conf <<EOF
php_value[date.timezone] = Asia/Tokyo
EOF

SELinuxの無効化

公式ドキュメントではSELinuxは有効なままhttpd_can_connect_zabbixとhttpd_can_network_connect_dbのブール値をonにする手順が記載されていますが、監視の手を広げるとこれだけでは立ち行かないところが出てきますので無効にします。

$ sudo setenforce 0
$ sudo sed -i.rpmorig 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

私の経験としては

  • Linux by Zabbix agentテンプレートに含まれるsystem.sw.packagesの値を取得できない(rpmコマンドが実行できないため)
  • SNMPトラップログファイルの読み込み権限が不足しSNMPトラップ監視ができない
  • データベース接続用のパスワード情報ファイル(.my.cnfや.pgpass)が読み込めずデータベース監視ができない

などがあります。解決のためにはおそらくポリシー作成が必要になってきますので(ファイルに関してはパス名を工夫し対処できる可能性もあります)、本記事ではSELinuxは無効にして対応します。

Zabbixサービス開始

$ sudo systemctl restart zabbix-server zabbix-agent httpd php-fpm
$ sudo systemctl enable zabbix-server zabbix-agent httpd php-fpm

Zabbixフロントエンドの設定

http://{IPアドレス または サーバー名}/zabbix にアクセスしてセットアップを実行すればインストールは完了です。
詳細は公式ドキュメントの6 Web interface installation [Zabbix Documentation 6.0]を参照してください。

テンプレート利用のための情報

Zabbixサーバーを構築すると数多くのテンプレートが標準で用意されていますが、実際に利用するとなると使い方が若干わかりにくいかと思います。
ZabbixのソースコードリポジトリにコミットされているREADME.mdドキュメントを見ると、監視項目(アイテムやトリガー)やテンプレートの利用方法が記載されています。
今回利用するミドルウェア用のテンプレートは以下で参照できます。

上記のApacheとPHP-FPM用テンプレートはHTTPエージェントを使った監視テンプレートですが、Zabbixエージェントを使って監視する版のApache by Zabbix agentやPHP-FPM by Zabbix agentというテンプレートも用意されています。

Apache by HTTPテンプレートを使ったApache HTTP Serverの監視

Apache HTTP Serverの設定

テンプレートのREADMEに倣って、ステータスモジュールの有効化確認とステータス表示URL用の設定を作成します。

$ httpd -M 2>/dev/null | grep status_module
status_module (shared)
$ sudo tee /etc/httpd/conf.d/server-status.conf <<EOF
<Location "/server-status">
  SetHandler server-status
  Require ip 127.0.0.1 ::1
</Location>
EOF

テンプレートのREADMEにも記載がありますが、ステータス表示URLを/server-statusから変更したい場合は、{$APACHE.STATUS.PATH}マクロも変更する必要があります。

Apacheを再起動して設定を反映し、ステータス表示URLにアクセスできるか確認します。

$ sudo systemctl restart httpd
$ curl -I http://localhost/server-status
HTTP/1.1 200 OK
Date: Wed, 13 Oct 2021 11:11:42 GMT
Server: Apache/2.4.37 (rocky) OpenSSL/1.1.1g
Content-Length: 6093
Content-Type: text/html; charset=ISO-8859-1

ステータス表示URLにアクセスできたらApache側の設定は完了です。

Apache by HTTPテンプレートのリンク

Zabbix serverホストにApache by HTTPテンプレートをリンクします。

[Configuration] > [Hosts]からZabbix serverを選択してTemplatesタブを確認すると、導入直後の状態ではLinux by Zabbix agentとZabbix server healthのみがリンクされている状態です。
[Link new templates]から[Select]を押下します。

Zabbix serverの初期テンプレートリンク状態

テンプレートの選択ダイアログでホストグループにTemplates/Applicationsを指定するとApache by HTTPテンプレートが出現しますのでチェックボックスで選択し[Select]を押下します。

Apache by HTTPテンプレートの選択

[Link new templates]にApache by HTTPがあることを確認して[Update]を押下します。

Apache by HTTPテンプレートのリンク

Apache by HTTPテンプレートのリンクが完了しました。

Apache by HTTPテンプレートのリンク完了

リンク後まもなく、Zabbix serverホストのアイテムとしてApache HTTP Serverのステータス情報が取得されるようになったことが確認できます。

Apache by HTTPテンプレートによるステータス情報

性能情報としては応答時間やワーカー数などを取得できますので、実運用ではそれらの値を見ながらチューニングを施すことになります。Zabbixのフロントエンドだけで使用している場合はシビアなチューニングが必要になることはほとんどありませんが、業務用のフロントエンドとして利用している場合は監視が必要になるケースも多いかと思います。

PHP-FPM by HTTPテンプレートを使ったPHP-FPMの監視

PHP-FPMの設定

zabbixプールにステータス応答用の設定をおこないます。

$ sudo tee -a /etc/php-fpm.d/zabbix.conf <<EOF
pm.status_path = /status
ping.path = /ping
EOF

次にApache HTTP ServerでPHP-FPMステータス用のURLの場合、PHP-FPMにProxyする設定をおこないます。

$ sudo tee -a /etc/httpd/conf.d/zabbix.conf <<EOF

<Location ~ ^/(status|ping)$>
  SetHandler "proxy:unix:/run/php-fpm/zabbix.sock|fcgi://localhost"
  Require ip 127.0.0.1 ::1
</Location>
EOF

設定を反映し、PHP-FPMのステータス情報にアクセスできることを確認します。

$ sudo systemctl restart httpd php-fpm
$ curl http://localhost/status
pool:                 zabbix
process manager:      dynamic
start time:           13/Oct/2021:13:08:25 +0000
start since:          46
accepted conn:        8
listen queue:         0
max listen queue:     0
listen queue len:     0
idle processes:       5
active processes:     1
total processes:      6
max active processes: 1
max children reached: 0
slow requests:        0

PHP-FPM by HTTPテンプレートのリンク

Zabbix serverホストにPHP-FPM by HTTPテンプレートをリンクします。

[Configuration] > [Hosts]からZabbix serverを選択し、TemplatesタブでPHP-FPM by HTTPテンプレートをリンクします。手順はApache by HTTPテンプレートの場合と同じです。

PHP-FPM by HTTPテンプレートの選択
PHP-FPM by HTTPテンプレートのリンク
PHP-FPM by HTTPテンプレートのリンク完了

こちらも、Zabbix serverホストのアイテムとしてPHP-FPMのステータス情報が取得されるようになりました。

PHP-FPM by HTTPテンプレートによるステータス情報

PostgreSQL by user parametersテンプレートを使ったPostgreSQLの監視

PostgreSQLの設定

PostgreSQL by user parametersのREADMEの手順に従って順に実施します。

まずはPostgreSQLモニター用ユーザーの作成です。

$ echo "CREATE USER zbx_monitor WITH PASSWORD '<PASSWORD>' INHERIT" | psql -h $PGHOST -U postgres -W
$ echo "GRANT pg_monitor TO zbx_monitor" | psql -h $PGHOST -U postgres -W

ユーザー名のzbx_monitorはテンプレートのマクロにも指定されているデフォルトです。変更する場合はテンプレートマクロの変更が必要です。
また、ユーザー名とパスワードは後段の認証ファイルにも設定します。

監視用SQLファイルと認証ファイルの配置

ではpostgresql以下にあるSQLファイル群や.pgpassファイルをzabbixユーザーのホームディレクトリである/var/lib/zabbixに配置するよう記載されています。

しかし、いままでのインストール手順では作成されていないのでディレクトリ作成から。

$ sudo mkdir -m 700 /var/lib/zabbix
$ sudo chown zabbix: /var/lib/zabbix

次に監視用SQLファイルだけをダウンロードして配置したいところなのですが、Gitではソースツリーの一部だけをクローンすることができません。少々もったいないですが、https://git.zabbix.com/scm/zbx/zabbix.gitをクローンして必要なディレクトリだけをコピーします。

$ git clone https://git.zabbix.com/scm/zbx/zabbix.git --depth 1
$ sudo cp -pr zabbix/templates/db/postgresql/postgresql /var/lib/zabbix/
$ sudo chown -R zabbix: /var/lib/zabbix/postgresql

同様にユーザーパラメーター設定も配置します。

$ sudo cp -p zabbix/templates/db/postgresql/template_db_postgresql.conf /etc/zabbix/zabbix_agentd.d/
$ sudo chown root: /etc/zabbix/zabbix_agentd.d/template_db_postgresql.conf
$ sudo chmod 644 /etc/zabbix/zabbix_agentd.d/template_db_postgresql.conf

zabbix_agentd.confには/etc/zabbix/zabbix_agentd.d/*.confをIncludeする設定が含まれていますので、zabibix-agentサービスを再起動すればユーザーパラメーターの反映は完了です。

$ grep ^Include= /etc/zabbix/zabbix_agentd.conf
Include=/etc/zabbix/zabbix_agentd.d/*.conf
$ sudo systemctl restart zabbix-agent

認証用のファイルを作成します。テンプレートのドキュメントではデータベース部分にpostgresを指定していますが、今回はAuroraのZabbixデータベースを監視したいので、ホスト名とデータベース名部分を"*"にしています。具体的な値はテンプレート適用後にマクロで設定します。
ユーザー名はパスワードは先ほど作成したモニター用のユーザーを指定してください。

$ sudo tee -a /var/lib/zabbix/.pgpass <<EOF
*:5432:*:zbx_monitor:<PASSWORD>
EOF
$ sudo chown zabbix: /var/lib/zabbix/.pgpass
$ sudo chmod 600 /var/lib/zabbix/.pgpass

PostgreSQL user parametersテンプレートのリンク

Zabbix serverホストにPostgreSQL user parametersテンプレートをリンクします。

[Configuration] > [Hosts]からZabbix serverを選択し、TemplatesタブでPostgreSQL user parametersテンプレートをリンクします。

PostgreSQL by user parametersテンプレートの選択
PostgreSQL by user parametersテンプレートのリンク
PostgreSQL by user parametersテンプレートのリンク完了

PostgreSQL user parametersテンプレートの場合、データベース名とデータベースホスト名の指定が必要です。それぞれテンプレートマクロ値がpostgres、127.0.0.1になっていますので、ホストマクロとして追加します。

今回はAurora上のZabbixデータベースを監視したいため、以下の指定にします。

マクロ名テンプレートマクロ値ホストマクロ値
{$PG.DB}データベース名postgreszabbix
{$PG.HOST}データベースホスト名127.0.0.1{Auroraのエンドポイント名}
ホストマクロの設定
PostgreSQL by user parametersテンプレート用のマクロ設定

Zabbix serverホストのアイテムとしてPostgreSQLのステータス情報が取得されるようになりました。

PostgreSQL by user parametersテンプレートによるステータス情報

PostgreSQL user parametersテンプレート利用時の考慮事項

今回はZabbixサーバー用のAuroraデータベースですのでZabbix serverの監視項目でも問題ないのですが、実際に業務利用するPostgreSQLの監視をする場合はデータベースサーバーをホスト名として監視したい場合が多いと思います。

ただ、Zabbix上の監視ホストはあくまでも「Zabbixエージェントのホスト」です。Zabbixエージェントをインストールできるサーバー上でPostgreSQLを動かしている場合は問題ありませんが、今回のようにZabbixエージェントをインストールできないAuroraインスタンスはホスト名にできません。

Auroraを使用するアプリケーションサーバーなどを利用して、アプリケーションサーバーの監視項目として取得することになると思います(Aurora用にダミーのZabbixエージェント環境を立ち上げるなどの方法もありそうですが、未検証なので割愛します)。

また、監視アイテム1件の取得のたびにSQL実行の外部プロセスがフォークされるタイプの監視ですので、利用にあたっては監視元の負荷にも注意する必要があります。

最後に

大量に登録されていて、いまいち使い方がわからないものも多いZabbixのテンプレートですが、Zabbixソースコードリポジトリのテンプレートドキュメントに従うと比較的簡単に利用できることがお分かりいただけたかと思います。

PostgreSQLに関してはSQLで値を取得しているだけですので、監視したい値を取得するSQLを作成してユーザーパラメーターを設定すれば独自の監視項目を拡張していくことも可能です。例えばAWSのナレッジに出ている、

で取得しているようなSQLの情報をZabbixで監視できるはず。多分。
pg_proctab拡張機能を使って、CloudWatchに頼ることなくAuroraインスタンスのCPU使用率やロードアベレージも監視できるでしょう。

Zabbixのバージョンアップでは本体の機能拡張やフロントエンドのきらびやかさに目が行きがちですが、同梱されているテンプレートもどんどん刷新されています。
「こんな項目、監視できないかなぁ」と思ったときに眺めてみると参考にできる情報が得られるかもしれません。

ではZabbix 6.0 LTSのリリースを心待ちにして本記事はおひらきとさせていただきます。

Zabbixの導入・構築でお困りですか?

Zabbixの導入・構築でお困りですか?アークシステムは、Zabbix Japan LLCの公式認定パートナーとして、豊富な実績と高い技術力でお客様をサポートします。

アークシステムが選ばれる理由

  • 豊富な経験: 多くのZabbix導入・構築プロジェクトを成功に導いた実績
  • 確かな技術力: Zabbix認定資格を持つエンジニアが対応
  • 独自のソリューション: 「監視定義テンプレート」を活用した迅速かつ高品質な実装
  • 最新情報へのアクセス: Zabbix社との強力なパートナーシップを活かした最新技術対応

こんな方に最適です

  • Zabbixの新規導入を検討している
  • 現行システムの運用に課題を感じている
  • 大規模環境での監視体制を整えたい

アークシステムでは、Zabbixの導入・運用に関する課題を解決し、最適な環境を構築します。どんなご相談でもお気軽にお問い合わせください!

  • Zabbix Enterprise Appliance
  • 低コスト・短納期で提供するまるごとおまかせZabbix