Grafanaダッシュボードを外出先から安全に監視!NginxリバースプロキシとサブパスでHTTPS外部公開する設定ガイド

未分類

自宅サーバーでGrafanaを使って温度・CPU・メモリなどを監視していると、「外出先からもダッシュボードを確認したい」という場面が出てきます。しかしGrafanaをそのままインターネットに直接公開するのはセキュリティ上の懸念があります。
本記事では、すでに構築済みのNginxリバースプロキシを活用して、GrafanaをHTTPS対応のサブパス(/grafana/)経由で外部公開する方法を解説します。既存のNginx設定に数行追加するだけで実現でき、LAN内・外部の両方から安全にアクセスできるようになります。

なぜこの機能を作ったのか?

自宅サーバーのGrafanaで室温・CPU温度・メモリ使用率などをリアルタイム監視していますが、初期設定ではLAN内のIPアドレス(http://192.168.68.89:3000)でしかアクセスできませんでした。
外出先から自宅サーバーの状態を確認したいとき、VPNを都度起動するのは手間がかかります。すでにNginxとLet’s Encrypt証明書でHTTPS環境が整っているなら、Nginxのリバースプロキシ設定を追加するだけでGrafanaを安全に外部公開できます
GrafanaにはログインID・パスワード認証が組み込まれているため、Nginxの後ろに置くことでHTTPS暗号化+Grafana認証の二段構えで保護できます。

外出先からでも自宅サーバーのGrafanaで温度やリソース状況をサクッと確認できるようにしたい!

実現したいこと

  • 外部(インターネット)から https://xxxx.tplinkdns.com/grafana/ でGrafanaにアクセスできる
  • LAN内からは http://192.168.68.89/grafana/ でアクセスできる
  • SSL/TLS暗号化(HTTPS)で通信を保護する
  • Grafana組み込みの認証機能でユーザー管理できる
  • LAN内アクセスはIPアドレス制限をかけてセキュアにする

この記事でわかること

  • UbuntuへのGrafanaのインストール手順
  • grafana.iniroot_url 設定の意味と正しい記述方法
  • Nginxのリバースプロキシ設定でサブパス(/grafana/)を使う方法
  • 外部公開とLAN内アクセスをNginxで使い分ける方法
  • Grafana初回セットアップとログイン確認の手順

必要な準備と用意するもの

ハードウェア

ハードウェア
  • 自宅サーバー(本記事では MINISFORUM NUCBox G3 Plus / Ubuntu Server 24.04)

ソフトウェア/サービス

ソフトウェア/サービス
  • Nginx(インストール済み・稼働中)
    • 参考記事:「NginxでHTTPSリバースプロキシを構築する」
  • Let’s Encrypt SSL証明書(取得済み)
    • 参考記事:「自宅サーバーのSSL証明書を無料取得する!Let’s Encrypt&Certbot完全ガイド」
  • Grafana(本記事でインストール)
    • バージョン:12.3.2
  • TP-Link DDNS(xxxx.tplinkdns.com)

完成イメージ

設定完了後は以下の2つのURLでGrafanaにアクセスできます。

アクセス元URL備考
外部(インターネット)https://xxxx.tplinkdns.com/grafana/HTTPS・Grafana認証
LAN内http://192.168.68.89/grafana/LAN内IPアドレス制限あり

ブラウザでアクセスするとGrafanaのログイン画面が表示され、管理者アカウントでサインインするとダッシュボードが利用できます。

システムの仕組み

リクエストがGrafanaに届くまでの経路を整理します。

外部アクセスの経路

ブラウザ → https://xxxx.tplinkdns.com/grafana/
 ↓ Deco ポートフォワーディング(443番ポート)
 ↓ NUCBox : Nginx(ポート443)
 ↓ proxy_pass http://127.0.0.1:3000//grafana/ プレフィックスを除去して転送)
 ↓ Grafana(ポート3000)

LAN内アクセスの経路

ブラウザ → http://192.168.68.89/grafana/
 ↓ NUCBox : Nginx(ポート80)
 ↓ proxy_pass http://127.0.0.1:3000/(IPアドレス制限:192.168.68.0/24のみ許可)
 ↓ Grafana(ポート3000)

サブパス(/grafana/)の仕組み

Nginxのサブパス設定では、URLのプレフィックス(/grafana/)を除去してGrafanaへ転送します。

ブラウザが送るURLGrafanaが受け取るURL
/grafana//
/grafana/d/dashboard-uid/d/dashboard-uid
/grafana/api/health/api/health

この仕組みが正しく動くよう、grafana.iniroot_url にサブパスを含めたURLを設定する必要があります。

実装のポイント

既存のNginx設定にロケーションブロックを追加するだけ
本記事の前提では、Nginxはすでに稼働しHTTPS設定も完了しています。GrafanaのNginx設定は、既存の server ブロック内に location /grafana/ { ... } を追加するだけです。新たにサーバーブロックを作る必要はありません。

Grafana組み込み認証でユーザー管理が完結する
GrafanaにはID・パスワード認証が組み込まれており、ユーザーごとのロール(Admin/Editor/Viewer)管理もできます。Nginxのリバースプロキシの背後に置くことで、HTTPS暗号化とGrafana認証の二段構えでセキュリティを確保できます。

proxy_pass のURL末尾のスラッシュに注意
proxy_pass http://127.0.0.1:3000/; と末尾にスラッシュをつけることで、Nginxはリクエストの /grafana/ プレフィックスを除去してGrafanaに転送します。スラッシュを省略すると /grafana/ プレフィックスがそのままGrafanaに渡され、正常に動作しません。

grafana.ini の root_url 設定を必ず変更する
root_url を正しく設定しないと、Grafanaが生成するリダイレクトURLが誤ったパスになり、ログイン後に画面が崩れたり、リダイレクトループが発生します。

事前準備

① Grafana公式リポジトリの追加

Ubuntuの標準リポジトリにはGrafanaが含まれていないため、Grafana公式のaptリポジトリを追加します。


# 必要パッケージのインストール
sudo apt install -y apt-transport-https software-properties-common wget

# Grafana公式GPGキーの追加
sudo mkdir -p /etc/apt/keyrings/
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null

# Grafana stableリポジトリの追加
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list

# パッケージリストの更新
sudo apt update

② Grafanaのインストール


sudo apt install -y grafana

インストール後、バージョンを確認します。


grafana --version
# 例: grafana version 12.3.2

実装方法

① grafana.ini の設定

grafana.ini はGrafanaのメイン設定ファイルです。[server] セクションの root_url を変更します。


sudo nano /etc/grafana/grafana.ini

[server] セクションを探して、以下のように設定します。


[server]
# Nginxのサブパス経由でアクセスする場合のパブリックURL
root_url = https://xxxx.tplinkdns.com/grafana/

root_url の意味
root_url はGrafanaが外部に公開されているURLをGrafana自身に伝えるための設定です。Grafanaはリダイレクト処理や埋め込みリンク生成にこの値を使います。サブパス(/grafana/)を含めた完全なURLを指定することで、NginxがプレフィックスをはがしてもGrafanaが正しいURLを生成できます。

② Grafanaの起動と自動起動設定


# Grafanaを起動 & OSの起動時に自動起動する設定
sudo systemctl enable --now grafana-server

# 起動状態を確認
sudo systemctl status grafana-server

以下のように Active: active (running) と表示されれば正常に起動しています。


● grafana-server.service - Grafana instance
     Loaded: loaded (/usr/lib/systemd/system/grafana-server.service; enabled; preset: enabled)
     Active: active (running) since ...

ポート3000でListenしていることも確認します。


ss -tlnp | grep 3000
# LISTEN  0  128  *:3000  *:*  users:(("grafana",pid=xxxx,fd=xx))

③ Nginx設定にGrafanaのロケーションブロックを追加する

既存のNginx設定ファイルに location /grafana/ ブロックを追加します。
外部向けHTTPS(443番ポート)と内部向けLAN(80番ポート)の両方のサーバーブロックに追加します。


sudo nano /etc/nginx/conf.d/default.conf

外部向けHTTPS(443番ポート)のサーバーブロック


server {
    listen 443 ssl;
    server_name xxxx.tplinkdns.com;

    # SSL設定(Let's Encrypt Certbot管理)
    ssl_certificate /etc/letsencrypt/live/xxxx.tplinkdns.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/xxxx.tplinkdns.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    # ... 他のlocationブロック ...

    # -----------------------------------------
    # /grafana/ : Grafana 外部アクセス
    # -----------------------------------------
    location /grafana/ {
        proxy_pass http://127.0.0.1:3000/;          # 末尾のスラッシュが重要
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;     # WebSocket対応
        proxy_set_header Connection 'upgrade';
        proxy_cache_bypass $http_upgrade;
    }
}

LAN内向け(80番ポート・IPアドレス制限あり)のサーバーブロック


server {
    listen 80;
    server_name 192.168.68.89;

    # ... 他のlocationブロック ...

    # -----------------------------------------
    # /grafana/ : 内部Grafana(LAN内限定)
    # -----------------------------------------
    location /grafana/ {
        proxy_pass http://127.0.0.1:3000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        allow 192.168.68.0/24;   # LAN内のIPのみ許可
        deny all;                # それ以外は拒否
    }
}

WebSocket対応の Upgrade / Connection ヘッダについて
GrafanaはリアルタイムでデータをプッシュするためにWebSocketを使用します。外部向け(HTTPS)の設定には proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection 'upgrade'; を追加しておくことで、Grafanaのライブ更新機能が正常に動作します。LAN内向けは固定IPからのアクセスのみなので省略しても動作しますが、揃えておくと安心です。

④ Nginx設定の構文チェックとリロード


# 設定ファイルの構文チェック
sudo nginx -t

# 問題なければリロード(サービス停止なし)
sudo systemctl reload nginx

nginx -t で以下のように表示されれば設定に問題ありません。


nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

コードの解説

proxy_pass のスラッシュが重要な理由

Nginxの location /grafana/ ブロックでの proxy_pass の動作を正確に理解しておくことが重要です。

設定ブラウザのURLGrafanaが受けるURL動作
proxy_pass http://127.0.0.1:3000/;(スラッシュあり)/grafana/d/xxx/d/xxx正常
proxy_pass http://127.0.0.1:3000;(スラッシュなし)/grafana/d/xxx/grafana/d/xxx404エラー

スラッシュありの場合、Nginxはマッチしたプレフィックス(/grafana/)を除去してから転送します。スラッシュなしだとパスがそのまま転送されてしまい、Grafana側では /grafana/... というパスのリソースが存在しないため404エラーになります。

grafana.ini の root_url と Nginx の連携

設定項目役割
root_url = https://xxxx.tplinkdns.com/grafana/GrafanaがログインリダイレクトやAPIレスポンス内URLを生成するときに使用するベースURL

Grafanaは内部的にリダイレクト先URLを生成するとき(ログイン後など)、root_url の値をベースにします。ここに正しいサブパスが含まれていないと、ログイン後に https://xxxx.tplinkdns.com/login などの誤ったURLにリダイレクトされます。

LAN内のIPアドレス制限


allow 192.168.68.0/24;   # LAN内(192.168.68.x)のIPのみ許可
deny all;                # それ以外(外部IPなど)はアクセス拒否

80番ポートのサーバーブロック(LAN内向け)では allow/deny ディレクティブでIPアドレス制限を設けています。これにより、万が一80番ポートが外部に露出しても、LAN以外のIPからのアクセスをNginxレベルで遮断できます。

動作確認

① Grafana 初回ログイン

まずLAN内からアクセスして初回セットアップを行います。ブラウザで以下のURLにアクセスします。

http://192.168.68.89/grafana/

Grafanaのログイン画面が表示されます。初期ログイン情報は以下の通りです。

項目初期値
ユーザー名admin
パスワードadmin

初回ログイン後に必ずパスワードを変更する
初期パスワード admin は非常に危険です。初回ログイン後に強力なパスワードへの変更画面が表示されます。外部公開する前に必ず変更してください。

② APIヘルスチェックで確認

Grafanaの /api/health エンドポイントでサービスが正常に応答しているか確認できます。


# LAN内からの確認
curl http://192.168.68.89/grafana/api/health

# 外部URLからの確認(DDNSドメイン)
curl https://xxxx.tplinkdns.com/grafana/api/health

正常な場合は以下のようなJSONが返ります。


{"commit":"xxxxxxx","database":"ok","version":"12.3.2"}

③ 外部からブラウザでアクセス確認

スマートフォンのモバイル通信(Wi-Fiをオフにしてキャリア回線)などLAN外のネットワークから以下のURLにアクセスします。

https://xxxx.tplinkdns.com/grafana/

以下の点を確認します。

  • ブラウザのアドレスバーに鍵マーク(🔒)が表示される(HTTPS通信)
  • Grafanaのログイン画面が表示される
  • ログイン後にダッシュボードが正常に表示される
  • グラフのデータがリアルタイムで更新される(WebSocket確認)

④ トラブルシューティング

502 Bad Gateway が表示される
Grafanaが起動していない可能性があります。sudo systemctl status grafana-server で状態を確認し、停止していれば sudo systemctl start grafana-server で起動します。

ログイン後にリダイレクトループが発生する
grafana.iniroot_url が正しく設定されていない可能性があります。root_urlhttps://xxxx.tplinkdns.com/grafana/ と正確に設定されているか確認し、設定変更後は sudo systemctl restart grafana-server で再起動します。

CSS/JSが読み込まれず画面が崩れる
root_url のサブパス(/grafana/)が正しく設定されていないか、proxy_pass の末尾スラッシュが抜けている可能性があります。Nginx設定の proxy_pass http://127.0.0.1:3000/; の末尾スラッシュを確認し、root_url の設定も再確認してください。

LAN内からアクセスできない(403 Forbiddenになる)
LAN内向けサーバーブロックの allow 192.168.68.0/24; がアクセス元のLANサブネットと一致しているか確認します。Decoのネットワーク設定でLANのIPレンジを確認してください。

まとめ

本記事では、GrafanaをNginxリバースプロキシ経由でHTTPS外部公開する方法を解説しました。

  • Grafana 公式リポジトリからインストール(sudo apt install -y grafana
  • grafana.iniroot_url にサブパス付きの公開URLを設定(https://xxxx.tplinkdns.com/grafana/
  • Nginx の外部向けサーバーブロックに location /grafana/ { proxy_pass http://127.0.0.1:3000/; ... } を追加
  • LAN内向けサーバーブロックには allow 192.168.68.0/24; deny all; でIPアドレス制限を追加
  • proxy_pass 末尾のスラッシュでサブパスプレフィックスを除去し、Grafanaが正しいURLを受け取るようにした

Grafanaの認証機能とNginxのHTTPS終端を組み合わせることで、外出先からも安全に自宅サーバーの状態を監視できるようになりました。次のステップとして、Grafanaにデータソース(Prometheus、InfluxDB、SQLiteなど)を追加してダッシュボードを構築していきましょう。

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