自宅サーバーで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.iniのroot_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へ転送します。
| ブラウザが送るURL | Grafanaが受け取るURL |
|---|---|
/grafana/ | / |
/grafana/d/dashboard-uid | /d/dashboard-uid |
/grafana/api/health | /api/health |
この仕組みが正しく動くよう、grafana.ini の root_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 の動作を正確に理解しておくことが重要です。
| 設定 | ブラウザのURL | Grafanaが受ける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/xxx | 404エラー |
スラッシュありの場合、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.ini の root_url が正しく設定されていない可能性があります。root_url が https://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.iniのroot_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など)を追加してダッシュボードを構築していきましょう。

