2026年8月11日
2026年8月11日
WordPressのパフォーマンスをGrafana・Prometheusで監視する方法
はじめに
WordPressサイトのパフォーマンス問題は多くの場合、問題が深刻化してから気づくものです。GrafanaとPrometheusを組み合わせることでCPU・メモリ・DBクエリ数・レスポンスタイムを継続的に可視化し、問題の予兆を早期に検知できます。本記事では監視スタックの構築からSlackアラートまでを実践的に解説します。
症状・原因
- サイト応答が遅い原因がサーバーリソース不足なのかDB負荷なのか判断できない
- トラフィックスパイク時に何が起きているかリアルタイムで把握できない
- 障害後にログを手動で掘り起こす作業に多大な時間がかかっている
解決手順
ステップ1:node_exporterをインストールしてシステムメトリクスを収集する
CPU・RAM・ディスクI/Oなどのシステムメトリクスをnode_exporterで収集します。
# Ubuntu/Debianへのインストール
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.1/node_exporter-1.8.1.linux-amd64.tar.gz
tar xvf node_exporter-1.8.1.linux-amd64.tar.gz
sudo mv node_exporter-1.8.1.linux-amd64/node_exporter /usr/local/bin/
# systemdサービスとして登録する
sudo tee /etc/systemd/system/node_exporter.service << 'EOF'
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=nobody
# デフォルトポート9100でメトリクスを公開する
ExecStart=/usr/local/bin/node_exporter --web.listen-address=":9100"
Restart=always
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
# 動作確認: http://localhost:9100/metricsでメトリクスが表示されればOK
curl -s http://localhost:9100/metrics | grep "node_cpu_seconds_total" | head -3
ステップ2:WordPressカスタムメトリクスをREST APIエンドポイントで公開する
DBクエリ数・ピークメモリなどWordPress固有のメトリクスをカスタムエンドポイントで提供します。
<?php
// functions.php に追加 ─ Prometheusスクレイプ用のカスタムメトリクスエンドポイント
add_action( 'rest_api_init', function() {
register_rest_route( 'metrics/v1', '/wordpress', [
'methods' => 'GET',
'callback' => 'expose_wordpress_metrics',
// ローカルネットワーク(Prometheusサーバー)からのみアクセス許可
'permission_callback' => function() {
$allowed_ips = [ '127.0.0.1', '10.0.0.0/8' ];
$client_ip = $_SERVER['REMOTE_ADDR'];
return in_array( $client_ip, $allowed_ips, true );
},
] );
} );
function expose_wordpress_metrics() {
global $wpdb;
// DBクエリ数を取得(SAVEQUERIES定数が必要)
$query_count = defined( 'SAVEQUERIES' ) && SAVEQUERIES ? count( $wpdb->queries ) : 0;
// PHPのピークメモリ使用量をバイト単位で取得
$peak_memory = memory_get_peak_usage( true );
// Prometheusテキスト形式でメトリクスを出力する
$output = "# HELP wordpress_db_query_count Total DB queries this request\n";
$output .= "# TYPE wordpress_db_query_count gauge\n";
$output .= "wordpress_db_query_count {$query_count}\n\n";
$output .= "# HELP wordpress_peak_memory_bytes Peak PHP memory usage\n";
$output .= "# TYPE wordpress_peak_memory_bytes gauge\n";
$output .= "wordpress_peak_memory_bytes {$peak_memory}\n\n";
// キャッシュヒット率も記録する
$cache_hits = wp_cache_get( 'hits', 'cache_stats' ) ?: 0;
$cache_misses = wp_cache_get( 'misses', 'cache_stats' ) ?: 0;
$output .= "# HELP wordpress_object_cache_hits Object cache hit count\n";
$output .= "# TYPE wordpress_object_cache_hits counter\n";
$output .= "wordpress_object_cache_hits {$cache_hits}\n";
return new WP_REST_Response( $output, 200, [ 'Content-Type' => 'text/plain; version=0.0.4' ] );
}
ステップ3:Prometheusのスクレイプ設定を構成する
prometheus.yml にWordPressとnode_exporterのスクレイプターゲットを追加します。
# /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s # 15秒ごとにメトリクスを収集する
evaluation_interval: 15s # アラートルールを15秒ごとに評価する
scrape_configs:
# システムメトリクス(CPU・RAM・ディスク)
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
labels:
instance: 'wordpress-server'
# WordPressカスタムメトリクス
- job_name: 'wordpress'
metrics_path: '/wp-json/metrics/v1/wordpress'
scheme: 'https'
static_configs:
- targets: ['example.com']
labels:
site: 'example.com'
# MySQLメトリクス(mysqld_exporterを別途インストール)
- job_name: 'mysql'
static_configs:
- targets: ['localhost:9104']
ステップ4:GrafanaダッシュボードでWordPressパフォーマンスを可視化する
GrafanaにPrometheusデータソースを追加し、主要パネルのPromQLクエリを設定します。
# GrafanaをDockerで起動(設定永続化)
docker run -d \
--name grafana \
-p 3000:3000 \
-v grafana-storage:/var/lib/grafana \
-e GF_SECURITY_ADMIN_PASSWORD=your-secure-password \
grafana/grafana:latest
# Prometheusもdocker-composeで管理する場合のcompose.yml
cat > docker-compose.yml << 'EOF'
services:
prometheus:
image: prom/prometheus:latest
ports: ["9090:9090"]
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus
grafana:
image: grafana/grafana:latest
ports: ["3000:3000"]
volumes:
- grafana-data:/var/lib/grafana
environment:
GF_SECURITY_ADMIN_PASSWORD: your-secure-password
volumes:
prometheus-data:
grafana-data:
EOF
ステップ5:アラートルールとSlack Webhookで通知を設定する
レスポンスタイム超過やエラー率上昇を検知してSlackに通知します。
# /etc/prometheus/alerts.yml ─ アラートルールの定義
groups:
- name: wordpress_alerts
rules:
# レスポンスタイムが2秒を超えた場合にアラートを発火する
- alert: WordPressHighResponseTime
expr: probe_duration_seconds{job="wordpress"} > 2
for: 5m # 5分間継続した場合のみ通知(一時的なスパイクは無視)
labels:
severity: warning
annotations:
summary: "WordPress応答が遅い: {{ $labels.instance }}"
description: "レスポンスタイム {{ $value }}秒(閾値: 2秒)"
# エラー率が1%を超えた場合にアラートを発火する
- alert: WordPressHighErrorRate
expr: rate(nginx_http_requests_total{status=~"5.."}[5m]) /
rate(nginx_http_requests_total[5m]) > 0.01
for: 2m
labels:
severity: critical
annotations:
summary: "WordPress 5xxエラー率上昇: {{ $labels.instance }}"
description: "エラー率 {{ $value | humanizePercentage }}"
# /etc/alertmanager/alertmanager.yml ─ Slackへの通知設定
receivers:
- name: slack-notifications
slack_configs:
- api_url: 'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK'
channel: '#wordpress-alerts'
# アラートの内容をSlackメッセージとして整形する
text: '{{ range .Alerts }}{{ .Annotations.description }}{{ end }}'
注意事項
- メトリクスエンドポイントの保護:
/wp-json/metrics/v1/wordpressはIPフィルタリングまたはBasic認証で保護し、外部に公開しないこと - SAVEQUERIES定数: DBクエリ数を記録するにはwp-config.phpで
define('SAVEQUERIES', true)が必要。本番環境ではメモリ消費が増えるため注意 - Prometheusのストレージ: デフォルトの保持期間は15日。長期保存にはThanos等のリモートストレージを検討すること
まとめ
GrafanaとPrometheusを組み合わせることでWordPressのパフォーマンスボトルネックを定量的に特定・監視できます。アラートを設定することで問題の予兆を早期にキャッチし、ダウンタイムを最小化できます。関連記事:WordPressにElasticsearch全文検索を実装してUX・SEOを改善する方法