Prometheus + GrafanaでNGINXのアクセスログをサイト別にリアルタイム可視化してみた

この記事は約8分で読めます。
この記事が役立ったらブックマーク! あとで読み返したり、環境構築時のリファレンスに活用できます
B! はてなブックマークに追加

自宅サーバーでWebサイトを運用していると、CPUやメモリといったシステムメトリクスだけでなく、「今、どのサイトにどれくらいアクセスが来ているのか」「エラーは発生していないか telemetry(計測データ)として見たい」と思うことはありませんか?
システム監視でおなじみの Prometheus + Grafana ですが、標準の node-exporter だけではNGINXの詳細なアクセスログまで可視化できません。
そこで本記事では、prometheus-nginxlog-exporter を導入し、複数サイト(main や sub など)のアクセスログをリアルタイムにGrafanaで可視化する全手順を完全解説します!

💡 この記事でわかること

  • prometheus-nginxlog-exporter のセットアップ手順
  • 複数ドメインのログを1つの PromQL でまとめて集計・グラフ化する小ワザ
  • ProtectSystem のパーミッションエラーや Docker/UFW 通信エラーなどのハマりポイントと対処法

「データセンター管制室」のように、サーバー内のアクセス状況が波形となってリアルタイムに動くダッシュボードを手に入れましょう!

🛠️ 1. 全体構成と前提環境

今回の構成は以下の通りです。ホストOS上で動作する prometheus-nginxlog-exporter がNGINXのアクセスログをパースしてメトリクス化し、Docker上の Prometheus がそれを回収(Scrape)、最終的に Grafana でグラフ化します。

Plaintext
[ NGINX Access Log ]
        ↓ (/var/log/nginx/access.log)
[ prometheus-nginxlog-exporter ] (Host: Port 9113)
        ↓ Scrape
[ Prometheus ] (Docker Container)
        ↓ Query
[ Grafana ] (Docker Container)

📋 環境

  • OS: Ubuntu 24.04.4 LTS
  • Web Server: NGINX(マルチサイト運用: main, sub 等)
  • 監視基盤: Prometheus / Grafana(Docker Composeで構築)

🚀 2. prometheus-nginxlog-exporter のセットアップ

まずはホストOSに Exporter を導入します。

インストールと設定ファイルの作成

/etc/prometheus-nginxlog-exporter.hcl を作成(または編集)し、以下のように複数サイトのログ設定を記述します。

HCL
listen {
  port = 9113
  address = "0.0.0.0"
}

namespaces {
  name = "www"
  format = "$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\""
  source {
    files = [
      "/var/log/nginx/main_access.log"
    ]
  }
}

namespaces {
  name = "sub"
  format = "$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\""
  source {
    files = [
      "/var/log/nginx/sub_access.log"
    ]
  }
}

⚠️ 3. 実際にハマったトラブルシューティング(超重要)

構築時に多くの方が遭遇する2大ハマりポイントの解決策です。

罠①:systemd の ProtectSystem による起動失敗 (status=1/FAILURE)

Exporter を起動した際、ログ読み込み権限エラーで落ちる場合は systemd のセキュリティ制限が原因です。

Bash
sudo systemctl edit prometheus-nginxlog-exporter

以下を追記して、制限を緩和します。

INI
[Service]
ProtectSystem=off

設定後、サービスを再起動します。

Bash
sudo systemctl daemon-reload
sudo systemctl restart prometheus-nginxlog-exporter

罠②:Dockerコンテナからホストへ通信が届かない(UFWの設定)

Prometheus(Docker)からホスト(9113ポート)への接続が拒否される場合、UFWが通信をブロックしています。以下を実行してポートを開放します。

Bash
sudo ufw allow 9113/tcp

⚙️ 4. Prometheus の設定 (prometheus.yml)

Prometheus 側で Exporter をターゲットとして追加します。DockerコンテナからホストOSを指すため host.docker.internal を利用します。

YAML
scrape_configs:
  - job_name: 'nginx-log'
    scrape_interval: 15s
    static_configs:
      - targets: ['host.docker.internal:9113']

設定反映後、http://localhost:9090/targets で nginx-log の State が UP になっていることを確認してください。

📊 5. Grafana でマルチサイトを一括可視化する (PromQL)

Grafana の Explore 画面(または Dashboard)で、複数サイトのメトリクスを1つのグラフにまとめて表示する PromQL です。

① 全サイトのリクエストレート(RPS)をステータス別に表示(おすすめ)

Plaintext
sum(rate({__name__=~"nginx_(main|sub)_http_response_count_total"}[5m])) by (site, status)

💡 ポイント
{__name__=~"nginx_(main|sub)_..."} のように正規表現マッチを使用することで、sub と main のメトリクスを一度のクエリでまとめて取得・描画できます。

🎨 Legend(凡例)の整形

グラフ下の表示をスッキリさせるため、パネル設定の Legend 項目に以下を指定します。

Plaintext
{{site}} (HTTP {{status}})

これで sub (HTTP 200) や main (HTTP 404) のように、一目でどのサイトのどのステータスかが分かる美しいグラフが完成します!

📝 まとめ

システム全体の健全性を見る node-exporter に加え、今回設定した prometheus-nginxlog-exporter を導入することで、Webサービス層のリアルタイムな動向まで完全に把握できるようになりました。
トラブル時のログ確認の手間も大幅に削減できるため、自宅サーバーや自作インフラを運用している方はぜひ導入してみてください!

コメント

タイトルとURLをコピーしました