让 Discourse 能够看到 Prometheus 服务器的 IP

大家好!

到目前为止,如果我的理解正确,要确保 Prometheus 实例能够从 /metrics 端点抓取数据,我们必须通过编辑 DISCOURSE_PROMETHEUS_TRUSTED_IP_WHITELIST_REGEX 将该机器的 IP 地址添加到允许列表中。

还有其他方法吗?我们的 Discourse 实例位于 Cloudflare 的 DNS 代理之后,无法看到最终用户的实际 IP 地址。我真的很希望能找到一种使用 API 密钥的方法,尽管由于 Prometheus 摄取数据的限制,这似乎不太可能。

那么 Discourse 就无法正常工作,您需要添加 Cloudflare 模板。

我认为这样可以。您尝试过了吗?哦,但我不认为您可以让 Grafana 将密钥放入请求头中,这也是我最初添加此功能的原因。

那么 Discourse 就出问题了,你需要添加 Cloudflare 模板。

啊,你说的“Cloudflare 模板”是什么意思?

我想那样应该能行。你试过了吗?哦,但我认为你无法让 Grafana 将密钥放入请求头,这也是我最初添加此功能的原因。

是的,我试过了。Prometheus 仍然不允许在抓取配置中使用自定义请求头。因此,如果无法将 Prometheus 服务器的 IP 地址加入白名单(在我的情况下这是不可能的),我就无法在 Prometheus 中接收 Discourse 的指标。

可能还有其他人在 Cloudflare 等代理后面运行他们的 Discourse 实例。考虑到这一点,我相信我们需要对导出器进行一些调整。

Discourse 的 API 使用其自己的 Api-KeyApi-Username 请求头,而不是某种“相对标准化”的方式(例如 HTTP 基本认证,而 Prometheus 的抓取子系统支持该方式)。因此,在我的设置中,我真的无法使用这种方式。

您需要进行搜索。不过,您可以在 templates 目录中找到它,并将其添加到您的 app.yml 中。

谢谢!

已启用 cloudflare.template.yml:slight_smile: 但据我理解,那只是为了禁用来自 Cloudflare IP 地址的流量速率限制。

目前,我的 Prometheus 配置如下:

scrape_configs:
        - job_name: forum
          scrape_interval: 5s
          scheme: https
          static_configs:
                  - targets:
                          - forum-behind-cloudflare-dns-proxy.com

现在我面临的问题是,Discourse 无法看到请求的实际 IP 地址。因此,为了让白名单方法生效,我尝试了以下操作:

  1. 将我的 Prometheus 服务器的 IPv6 地址添加到 app.yml 中的 DISCOURSE_PROMETHEUS_TRUSTED_IP_WHITELIST_REGEX 环境变量中。

  2. 在 Prometheus 服务器的 /etc/hosts 文件中硬编码了论坛的实际 IPv6 地址。现在,论坛可以看到我的 Prometheus 服务器的 IP 地址并允许访问。:slight_smile:

我还有其他一些问题。例如,我在容器中运行 Prometheus。宿主机的 /etc/hosts 并未在容器内共享。因此,它持续将论坛地址解析为 Cloudflare IP,并在认证过程中失败。

我可以在启动 Prometheus 时通过 -v /etc/hosts:/etc/hosts 将宿主机的 /etc/hosts 共享到 Docker 容器中,但这会导致如下错误:

Get "https://forum-behind-cloudflare-dns-proxy.com:443/metrics": dial tcp [<ipv6-address>]:443: connect: cannot assign requested address

现在我需要解决这个具体问题。

编辑 #1:这个问题也解决了。Docker 容器内禁用了 IPv6。我可以通过在 Docker 容器中启用 IPv6 或使用 --net=host 来修复它。

您是否位于反向代理之后?您需要配置 nginx,以便让真实的远程 IP 能够访问 Discourse。我认为这篇帖子 在同一台机器上运行其他网站与 Discourse 可能会为您提供一些解决思路。

该 Discourse 实例确实运行在反向代理之后。该反向代理由 Cloudflare 提供,我们目前仅使用 Pro 套餐,无法将真实的客户端 IP 从 Cloudflare 传递给 Discourse 实例。不过,我的问题已经解决了。:slight_smile:

Grafana 仪表板现在可能也需要更新。随着时间的推移,Prometheus exporter 已更新,不再发送某些指标,但 Grafana 仪表板仍配置为读取这些(现已不存在的)指标的值。