核心在于三端协同:prometheus需配置--web.external-url指定代理路径,nginx需用proxy_pass http://.../(末尾斜杠)并透传host/x-forwarded头,grafana数据源url须匹配该路径且access选server模式。

要让 Grafana 通过反向代理访问物理隔离网络中的私有云 Prometheus,核心在于解决网络可达性和路径/认证一致性两个问题。这不是单纯改个 URL 就能通的,需在 Grafana、反向代理(如 Nginx)、Prometheus 三端协同配置。
确保 Prometheus 支持外部代理访问
Prometheus 默认绑定 localhost:9090,且不处理带子路径的请求。若通过反向代理暴露为 https://monitor.example.com/prometheus/,必须显式告知 Prometheus 这个“外部上下文”:
- 启动时添加
--web.external-url=https://monitor.example.com/prometheus/参数(注意末尾斜杠) - 该参数会重写所有内部链接、静态资源路径、API 响应头中的重定向地址,避免 Grafana 加载 JS/CSS 失败或跳转回
localhost - 若使用 systemd 启动,修改
/usr/lib/systemd/system/prometheus.service中的ExecStart行并重载服务
配置反向代理(以 Nginx 为例)
Nginx 需完成三件事:转发请求、透传 Host 和协议头、正确处理子路径重写:
- 在 server 块中定义 location:
location /prometheus/ {<br> proxy_pass http://10.10.20.5:9090/;<br> proxy_set_header Host $host;<br> proxy_set_header X-Real-IP $remote_addr;<br> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br> proxy_set_header X-Forwarded-Proto $scheme;<br>} - 关键点:
proxy_pass末尾的/必须存在,否则会导致路径拼接错误(如变成/prometheus/api/v1/query→/api/v1/query) - 若私有云集群无公网出口,Nginx 必须部署在可同时访问外网(Grafana 所在网络)和内网(Prometheus 所在网络)的“桥接节点”上
Grafana 数据源配置要点
在 Grafana 的「Add data source」中选择 Prometheus 类型后,重点填以下字段:
-
URL:填写 Nginx 对外暴露的完整地址,例如
https://monitor.example.com/prometheus/(结尾斜杠不可省) -
Access:选
Server (default)(即 Grafana 后端代为请求),不能选 Browser,否则浏览器直连会失败(跨域 + 网络不可达) -
HTTP Auth:若 Nginx 启用了 Basic Auth,勾选
Basic auth并填入账号密码 -
Custom HTTP Headers:如 Prometheus 实例启用了 Token 鉴权(如阿里云可观测 Prometheus 版),添加 Header:
Key =Authorization,Value =Bearer <your-token></your-token>
验证与排错关键项
配置完成后,点击 Save & Test,失败时按顺序排查:
- Grafana 容器或进程能否解析
monitor.example.com域名?尝试在 Grafana 服务器上执行curl -v https://monitor.example.com/prometheus/api/v1/status/config - Nginx 日志是否返回 502?检查
proxy_pass地址是否可达、端口是否开放、防火墙策略 - Prometheus 日志是否出现
invalid Host header?确认 Nginx 中proxy_set_header Host已启用 - 浏览器开发者工具 Network 标签中,是否有 JS/CSS 请求 404?说明
--web.external-url缺失或格式错误








