首页 > 解决方案 > 在带有令牌身份验证的 iframe 中,在 nginx 反向代理后面设置 Grafana docker

问题描述

我正在尝试设置在 nginx 反向代理后面的 docker-compose 上运行的 Grafana,只要我将 [auth.anonymous] 设置为启用 = true,它就可以正常工作。

但是当我禁用匿名登录并尝试在标头中使用“授权”令牌登录时,导航到 Grafana sub_path 时出现以下错误:

如果您看到此 Grafana 未能加载其应用程序文件

  1. 这可能是由您的反向代理设置引起的。

  2. 如果您在子路径下托管 grafana,请确保您的 grafana.ini root_path 设置包含子路径

  3. 如果您有本地开发版本,请确保您使用以下方式构建前端:npm run dev、npm run watch 或 npm run build

  4. 有时重新启动 grafana-server 会有所帮助

我的 ngnix.conf 设置是:

server {
  listen 80
  charset utf-8
  location /grafana-dashboard/ {
    proxy_pass http://grafana:3000/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_max_temp_file_size 0;
  }
}

Grafana 在 docker-compose 的 grafana:3000 上运行。

docker-compose.config.yaml 内容为:

version: '3.4'
services:
  grafana:
    container_name: grafana
    depends_on:
      - db
    networks:
    - static-network
    ports:
    - 3000:3000
    restart: always
    volumes:
    - grafana_stor:/var/lib/grafana
    environment:
    - GF_AUTH_PROXY_ENABLED=true
    - GF_SERVER_DOMAIN=10.0.0.3
    - GF_SERVER_ROOT_URL=http://10.0.0.3/grafana-dashboard/
    user: "472"

volumes:
  grafana_stor: {}

networks:
  static-network:
    ipam:
      config:
    - subnet: 172.20.0.0/16

在访问 10.0.0.3/grafana-dashboard/ 之前,我使用 Grafana HTTP_API /api/auth/keys 生成 API_KEY,然后在客户端的“Authorization: Bearer [token]”标头上传递返回的令牌。

澄清一下,grafana-dashboard 旨在显示在我的 webapp 内的 iframe 上,但由于我需要传递 Authorization 标头,因此我向 nginx 提供的 /grafana-dashboard/ 发出请求,然后放置“blob”对 iframe 的响应。

整个想法是对 grafana 和我的 webapp 进行“单点登录”。因此,刚刚登录 webapp 的用户也不需要登录 grafana。但是如果直接使用 grafana(不是来自 iframe),则需要 grafana 登录屏幕或 nginx 简单身份验证。

标签: grafananginx-reverse-proxy

解决方案


通过将来自 Grafana HTTP API 的 API 密钥作为 cookie 附加,我能够使其工作。然后,在我的 中nginx.conf,我有:

location /grafana-dashboard/ {

    # The important line:
    proxy_set_header Authorization "Bearer $cookie_grafana_key";

    proxy_pass http://grafana:3000/;
}

这样,您可以iframe正常使用 an 而不必担心设置标题。

此外,我不确定这是否是 nginx 配置问题,但是当我在 AJAX 请求中添加授权标头和 API 密钥时——而不是将密钥作为 cookie 传递——我也收到了原始错误。我不确定上面是什么。


推荐阅读