「サーバーが遅い」というバグ報告は役に立ちません。グラフを開いて、クラッシュの 3 日前からメモリが上がり続けていたと確認できるなら話は別です。それを可能にするのが Prometheus と Grafana です。各サーバーの CPU、RAM、ディスク、ネットワークを 15 秒ごとに記録し、さかのぼってスクロールできるグラフとして描きます。専用の小さな VPS に置いておけば、本番マシンが倒れても監視を続けてくれます。
構成要素
- node_exporter:監視したい各サーバーで動かし、9100 番ポートでシステムメトリクスを公開します。
- Prometheus:監視用 VPS で、それらのメトリクスを収集(スクレイプ)して保存します。
- Grafana:HTTPS の背後に置くダッシュボードです。
- 任意で Alertmanager または Grafana のアラートを使い、しきい値を超えたら通知させます。
必要なもの
- Micro-IP(月額 $10、2 vCPU、2 GB RAM、25 GB)で 1〜2 ダースのサーバーを監視できます。ホストが多い、独自のアプリメトリクスがある、数か月の保持が必要なら Small-IP です。
- 監視サーバー用の専用 IPv4:Grafana は HTTPS で配信され、監視対象は 9100 番ポートに対して固定アドレス一つだけを許可できます。
1. 各監視対象に node_exporter
apt install -y prometheus-node-exporter
# allow only the monitoring server to scrape it
ufw allow from 203.0.113.10 to any port 9100 proto tcp
203.0.113.10 は監視用 VPS のアドレスに置き換えてください。9100 番を世界中に開けたままにしてはいけません。サーバーについて多くの情報が漏れます。
2. 監視用 VPS に Prometheus と Grafana
apt update && apt install -y docker.io docker-compose-v2 caddy
mkdir -p /opt/monitoring && cd /opt/monitoring
cat > prometheus.yml <<'EOF'
global:
scrape_interval: 15s
scrape_configs:
- job_name: nodes
static_configs:
- targets: ['198.51.100.21:9100', '198.51.100.22:9100']
EOF
cat > compose.yml <<'EOF'
services:
prometheus:
image: prom/prometheus
volumes: [ "./prometheus.yml:/etc/prometheus/prometheus.yml:ro", "prom:/prometheus" ]
command: [ "--config.file=/etc/prometheus/prometheus.yml", "--storage.tsdb.retention.time=15d", "--web.enable-remote-write-receiver" ]
ports: [ "127.0.0.1:9090:9090" ]
restart: unless-stopped
grafana:
image: grafana/grafana
volumes: [ "grafana:/var/lib/grafana" ]
ports: [ "127.0.0.1:3000:3000" ]
restart: unless-stopped
volumes: { prom: {}, grafana: {} }
EOF
docker compose up -d
Grafana の前段に HTTPS を置きます。
echo 'grafana.example.com {
reverse_proxy 127.0.0.1:3000
}' > /etc/caddy/Caddyfile && systemctl reload caddy
ログインし(admin / admin、その後変更)、http://prometheus:9090 を Prometheus のデータソースとして追加し、コミュニティのダッシュボード「Node Exporter Full」(ID 1860)をインポートします。1 分ほどで完全なシステムダッシュボードが手に入ります。
NAT プランのサーバー
NAT サーバーが受信接続を受け付けるのは個人用 SSH ポートだけなので、Prometheus はそのエクスポーターをスクレイプできません。向きを逆にしましょう。NAT マシンで Prometheus をエージェントモードで動かし、すでにリモート書き込みを受け付けている監視サーバー(上記の --web.enable-remote-write-receiver フラグ)へ送ります。
# /etc/prometheus/agent.yml on the NAT server
scrape_configs:
- job_name: self
static_configs: [ { targets: ['127.0.0.1:9100'] } ]
remote_write:
- url: https://prom-push.example.com/api/v1/write
9090 番をそのまま開けるのではなく、その受信エンドポイントは basic 認証付きで Caddy 経由で公開してください。
正直なメモ
Prometheus はプル型です。自分で管理するサーバー群には最適ですが、NAT の内側にあるものには不便で、だからこそエージェントの工夫が必要になります。ローカルストレージは何年分もの履歴を想定していないので、長期保持が必要なら後からリモートストレージを追加します。そしてダッシュボードは価値の半分にすぎません。初日に少なくとも 3 つのアラート(ディスク 85% 超、メモリ逼迫、監視対象のダウン)を設定しないと、グラフを見るのは何かが壊れた後になってしまいます。
関連
- 稼働監視向け VPS(Uptime Kuma):障害通知とステータスページ
- UFW ファイアウォールの設定方法
- VPS に必要な RAM はどれくらい?
コメント
まだコメントはありません。最初になりましょう。