必须同时配置Nginx路径重写与Grafana的root_url+serve_from_sub_path,否则会出现白屏、404或重定向错误;Nginx需剥离/grafana/前缀并传递X-Forwarded-*头,Grafana需设root_url为https://domain/grafana/且serve_from_sub_path=true。

要让 Grafana 通过子路径(比如 /grafana)被 Nginx 代理访问,关键不是只改 Nginx 配置,而是 Nginx 和 Grafana 两端必须“约定一致”:Nginx 知道往哪转、怎么改路径;Grafana 知道自己现在是挂在一个子路径下,所有链接和资源都要带前缀。漏掉任一端,就会出现白屏、CSS 加载失败、跳转 404 或登录后反复重定向等问题。
Nginx 配置要点:路径重写与头信息传递
Nginx 需将 /grafana/ 开头的请求,正确剥离前缀后转发给 Grafana,并补全必要的 HTTP 头,确保后端能识别真实访问上下文。
- 使用
location /grafana/ { ... }块,注意结尾斜杠,避免路径拼接错误 - 用
proxy_pass http://127.0.0.1:3000/;(末尾带斜杠),这样 Nginx 会自动去掉匹配到的/grafana/,再把剩余路径(如/dashboard/db)转发过去 - 必须设置
proxy_set_header X-Forwarded-Proto $scheme;和X-Forwarded-Host $host;,否则 Grafana 可能生成 http 链接或错误域名 - 添加
proxy_set_header X-Real-IP $remote_addr;有助于日志和安全策略识别真实客户端
Grafana 配置核心:root_url 与 serve_from_sub_path
仅靠 Nginx 转发还不够。Grafana 必须知道自己正运行在子路径下,否则它生成的所有内部链接(如 JS、CSS、API 接口、跳转地址)仍以 / 为根,浏览器会向 https://your-domain.com/static/app.js 发起请求——而这个路径 Nginx 并未代理,自然 404。
- 编辑
conf/defaults.ini或自定义配置文件(如custom.ini),定位到[server]区块 - 设置
root_url = %(protocol)s://%(domain)s/grafana/(domain填你的实际域名,如monitor.example.com) - 务必开启
serve_from_sub_path = true,否则 Grafana 会忽略root_url中的路径部分 - 重启 Grafana 服务使配置生效
HTTPS 与证书注意事项
如果走 HTTPS 域名访问,SSL 终止通常在 Nginx 层完成。此时 Grafana 后端仍走 HTTP(如 http://127.0.0.1:3000),但需确保:
-
root_url中的%(protocol)s能正确解析为https,这依赖 Nginx 传入的X-Forwarded-Proto头 - Let’s Encrypt 申请证书时,域名需已解析到服务器 IP,且 Nginx 的 server_name 与之匹配
- 若使用 Certbot 自动配置,它会修改 Nginx 的 SSL server 块,但不会动 Grafana 配置,这部分仍需你手动完成
验证与排错小技巧
配置完成后,不要直接点开页面就下结论,按顺序检查几个关键点:
- 打开浏览器开发者工具 → Network 标签页,刷新页面,看是否有 404 请求,特别是
/grafana/public/build/或/grafana/api/health类路径 - 检查任意一个 JS 或 CSS 文件的响应头,确认
Content-Type正确,且返回内容不是 HTML(说明路径被错误路由到了 Grafana 根页面) - 访问
https://your-domain.com/grafana/api/health,应返回 JSON{"status":"ok"},这是最直接的连通性验证 - 登录后点击任意仪表板右上角 “Share” → “Direct link rendered image”,复制链接,确认其中的域名和路径前缀是否符合预期


















