2026年7月9日

2026年7月9日

Nagiosのプラグインを追加してカスタム監視を設定する方法

はじめに

Nagiosで標準プラグインにない監視を追加したい・WordPressのデータベース接続やキャッシュヒット率をNagiosで監視したい・カスタムプラグインの書き方がわからない・NRPE経由でリモートサーバーを監視したいといった問題の解決方法を解説します。

症状・原因

  • 標準のcheck_httpでは不十分でWordPress固有の状態を監視できない
  • プラグインのパーミッション設定が間違っていてNagiosから実行できない
  • プラグインの終了コードが間違いNagiosが正しくステータスを判断できない
  • NRPE設定のallowed_hostsにNagiosサーバーのIPが追加されていない

解決手順

ステップ1:Nagios プラグインの基本を理解する

# ✅ Nagios プラグインの終了コード規則(必ず遵守)
# 0: OK      → 緑(正常)
# 1: WARNING → 黄(警告)
# 2: CRITICAL → 赤(重大)
# 3: UNKNOWN → 灰(不明)

# ✅ プラグインの出力フォーマット
# "STATUS: メッセージ | パフォーマンスデータ"
# 例: OK: WordPress is healthy | response_time=0.23s;1.0;2.0;0;5

# ✅ プラグインディレクトリの確認
ls /usr/lib/nagios/plugins/
# → check_http  check_ping  check_disk  ... ← 標準プラグイン

# ✅ カスタムプラグインディレクトリ
ls /usr/local/nagios/libexec/
# または
ls /etc/nagios/plugins/

ステップ2:シェルスクリプトでプラグインを作成する

# ✅ WordPress のヘルスチェックプラグインを作成
sudo tee /usr/lib/nagios/plugins/check_wordpress << 'EOF'
#!/bin/bash

# ✅ Nagios プラグイン: WordPress ヘルスチェック
# 終了コード: 0=OK, 1=WARNING, 2=CRITICAL, 3=UNKNOWN

SITE_URL="${1:-http://localhost}"
WARNING_TIME="${2:-2.0}"   # レスポンスが2秒以上でWARNING
CRITICAL_TIME="${3:-5.0}"  # レスポンスが5秒以上でCRITICAL

# ✅ WordPress のレスポンス時間を測定
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}:%{time_total}" \
    --max-time 10 "$SITE_URL/" 2>/dev/null)

HTTP_CODE=$(echo "$RESPONSE" | cut -d: -f1)
RESPONSE_TIME=$(echo "$RESPONSE" | cut -d: -f2)

# ✅ HTTP ステータスコードのチェック
if [ "$HTTP_CODE" != "200" ] && [ "$HTTP_CODE" != "301" ] && [ "$HTTP_CODE" != "302" ]; then
    echo "CRITICAL: WordPress returned HTTP $HTTP_CODE | response_time=${RESPONSE_TIME}s"
    exit 2
fi

# ✅ レスポンス時間のチェック(bc コマンドで浮動小数点比較)
if [ "$(echo "$RESPONSE_TIME >= $CRITICAL_TIME" | bc)" -eq 1 ]; then
    echo "CRITICAL: Response time ${RESPONSE_TIME}s >= ${CRITICAL_TIME}s | response_time=${RESPONSE_TIME}s;${WARNING_TIME};${CRITICAL_TIME};0;10"
    exit 2
elif [ "$(echo "$RESPONSE_TIME >= $WARNING_TIME" | bc)" -eq 1 ]; then
    echo "WARNING: Response time ${RESPONSE_TIME}s >= ${WARNING_TIME}s | response_time=${RESPONSE_TIME}s;${WARNING_TIME};${CRITICAL_TIME};0;10"
    exit 1
fi

echo "OK: WordPress responding in ${RESPONSE_TIME}s | response_time=${RESPONSE_TIME}s;${WARNING_TIME};${CRITICAL_TIME};0;10"
exit 0
EOF

# ✅ パーミッションを設定
sudo chmod 755 /usr/lib/nagios/plugins/check_wordpress
sudo chown nagios:nagios /usr/lib/nagios/plugins/check_wordpress

# ✅ テスト実行
sudo -u nagios /usr/lib/nagios/plugins/check_wordpress http://example.com 2.0 5.0
# → OK: WordPress responding in 0.23s | response_time=0.23s;2.0;5.0;0;10
# 終了コードを確認
echo $?  # → 0

ステップ3:WordPress 固有の監視プラグインを作成する

# ✅ WordPress DB 接続確認プラグイン
sudo tee /usr/lib/nagios/plugins/check_wordpress_db << 'EOF'
#!/bin/bash

WP_PATH="${1:-/var/www/html}"
DB_CHECK=$(wp eval "
try {
    global \$wpdb;
    \$result = \$wpdb->get_var('SELECT 1');
    echo \$result == 1 ? 'OK' : 'FAIL';
} catch (Exception \$e) {
    echo 'ERROR: ' . \$e->getMessage();
}
" --path="$WP_PATH" 2>/dev/null)

if [ "$DB_CHECK" = "OK" ]; then
    echo "OK: WordPress database connection successful"
    exit 0
elif echo "$DB_CHECK" | grep -q "ERROR"; then
    echo "CRITICAL: $DB_CHECK"
    exit 2
else
    echo "CRITICAL: WordPress database check failed"
    exit 2
fi
EOF

sudo chmod 755 /usr/lib/nagios/plugins/check_wordpress_db

ステップ4:Nagios にカスタムコマンドを登録する

# ✅ コマンド定義ファイルを作成
sudo tee /etc/nagios/conf.d/custom_commands.cfg << 'EOF'
# ✅ WordPress ヘルスチェックコマンド
define command {
    command_name    check_wordpress
    command_line    /usr/lib/nagios/plugins/check_wordpress $ARG1$ $ARG2$ $ARG3$
}

# ✅ WordPress DB チェックコマンド
define command {
    command_name    check_wordpress_db
    command_line    /usr/lib/nagios/plugins/check_wordpress_db $ARG1$
}
EOF

# ✅ サービス監視定義を追加
sudo tee /etc/nagios/conf.d/wordpress_services.cfg << 'EOF'
define service {
    use                 generic-service
    host_name           wordpress-server
    service_description WordPress Health
    check_command       check_wordpress!http://example.com!2.0!5.0
    check_interval      5      ; 5分ごとにチェック
    max_check_attempts  3      ; 3回失敗したらアラート
}

define service {
    use                 generic-service
    host_name           wordpress-server
    service_description WordPress Database
    check_command       check_wordpress_db!/var/www/html
    check_interval      5
}
EOF

# ✅ 設定の構文チェック
sudo nagios -v /etc/nagios/nagios.cfg
# → Total Warnings: 0
# → Total Errors: 0

# ✅ Nagios を再起動
sudo systemctl reload nagios

ステップ5:NRPE でリモートサーバーを監視する

# ✅ 監視対象サーバーに NRPE をインストール
sudo apt install nagios-nrpe-server nagios-plugins -y

# ✅ NRPE の設定
sudo nano /etc/nagios/nrpe.cfg
# ✅ Nagios サーバーの IP を許可
allowed_hosts=127.0.0.1,192.168.1.100  # Nagiosサーバーのアドレス

# ✅ カスタムコマンドを定義
command[check_wordpress]=/usr/lib/nagios/plugins/check_wordpress http://localhost 2.0 5.0
command[check_disk_wp]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /var/www/html
command[check_mysql]=/usr/lib/nagios/plugins/check_mysql -u nagios -p nagiospass
# ✅ NRPE を起動
sudo systemctl enable nagios-nrpe-server
sudo systemctl start nagios-nrpe-server

# ✅ Nagios サーバーから NRPE で確認
/usr/lib/nagios/plugins/check_nrpe -H wordpress-server -c check_wordpress
# → OK: WordPress responding in 0.18s | response_time=0.18s;2.0;5.0;0;10

# ✅ Nagios サーバーの設定にリモートコマンドを追加
# define command {
#     command_name    check_nrpe
#     command_line    /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
# }

注意事項

  • Nagiosプラグインは必ずnagiosユーザーから実行可能なパーミッション(755)を設定してください。また、プラグインが外部コマンド(wp-cli等)を呼び出す場合は、nagiosユーザーがそのコマンドを実行できる権限があるか確認してください
  • プラグインの出力は1行のテキストと|の後にパフォーマンスデータを書きます。複数行出力の場合、2行目以降は「長い出力」として扱われます。Nagiosの設定でどちらを表示するか決まります

まとめ

Nagiosカスタムプラグインの設定は①終了コード規則(0=OK/1=WARNING/2=CRITICAL/3=UNKNOWN)の理解・プラグインの出力フォーマット(STATUS: メッセージ | パフォーマンスデータ)の確認、②シェルスクリプトでWordPressヘルスチェックプラグイン作成・curl -w "%{time_total}"でレスポンスタイム測定・HTTPコードと時間でOK/WARNING/CRITICAL判定、③WP-CLIを使ったDB接続確認プラグイン・chmod 755で実行権限設定・nagiosユーザーでテスト実行、④custom_commands.cfgでコマンド定義・wordpress_services.cfgでサービス監視設定・nagios -vで構文チェック・reload、⑤NRPEをインストール・allowed_hostsにNagiosサーバーIPを追加・command[名前]=でリモートコマンド定義・check_nrpeでリモート確認の手順で設定します。

お気軽にご相談ください

お見積りへ お問い合わせへ