将 Prometheous 与 Cloudflare 结合使用

是否有人尝试过在 Cloudflare 后面使用此功能,而无需将指标公开给公众?

问题是,当在 Cloudflare(或任何代理)后面时,Prometheus 的原始 IP 不在 HTTP 标头中的通常位置。

是否有任何方法可以通过 http 仅访问此功能,或者向 Discourse 添加额外的(子)域来创建 SSL 证书?

通过 IP 或可以设置为 Cloudflare 透明模式的附加子域访问它将是两个选项。另一个可能是修改插件以检查不同的 http 标头。我认为应该是 X-Forwarded-For 或 CF-Connecting-IP。我就是那种能做到这一点的人。后者可能是最明智的解决方案。

任何帮助都将不胜感激。

编辑:我刚刚意识到 Cloudflare 本身在 Cloudflare 后面非常有效地使用了正确的 IP。要么是插件执行的操作与 Cloudflare 本身不同,要么…… :thinking:

我认为您需要在与 Discourse 相同的服务器上运行 Prometheus,或许还有 Grafana,并通过反向代理提供服务。

1 个赞

那正是我不想做的。我宁愿不在生产服务器上做太多额外的事情,因为生产服务器已经因为论坛流量而负载很重了。另外,如果我需要设置反向代理,我可能就不需要在本地运行 Grafana 和 Prometheus 了,因为我可以轻松地将 /metrics 代理到 IP 地址并且不使用 HTTPS——但这听起来都有些笨拙。我以为会有更好的方法。

1 个赞

这东西不多。开销很小。

哦,等等。但是,如果你设置好了,让正确的远程 IP 到达 Discourse,那么你就可以将远程 IP 设置为你运行 prometheus 的任何地方,它就能工作。我用我监控过的一些网站就是这么做的。我很确定这就是为什么添加了 DISCOURSE_PROMETHEUS_TRUSTED_IP_ALLOWLIST_REGEX

你使用的是 cloudflare 模板吗?(推荐的做法是使用真正的 CDN,让 Discourse 自己决定代理哪些东西,但你也不想这样做。)

1 个赞

这正是我遇到的问题。

我正在使用一台没有被 Cloudflare 代理的测试机。我在那里设置了 prometheus exporter,并将 DISCOURSE_PROMETHEUS_TRUSTED_IP_ALLOWLIST_REGEX 设置为我的监控服务器,一切都运行良好。

但在生产机上却不行。

是的,我正在使用 cloudflare 模板

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## 如果你想添加 Lets Encrypt (https),请取消注释这两行
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"
  - "templates/cloudflare.template.yml"

并且用户管理员中的 IP 地址看起来是正确的。

到目前为止,我对 Cloudflare 的工作方式非常满意,它已经在 DDOS 防护方面提供了很大帮助,所以我宁愿不切换到其他 CDN 解决方案——至少我看不出有任何理由。

关于 prometheus exporter,我不确定为什么,但它似乎不像 Discourse 通常那样进行 IP 检查。我对 ruby 不够精通,无法在代码中验证这个假设,但我对此非常好奇。

如果您的社区容易遭受 DDOS 攻击,那么 Cloudflare 是一个很好的解决方案。

哦,它运行在自己的端口上,所以它绕过了 NGINX,而那正是那个模板所改变的,所以这就是为什么它不同。因此,如果您想让它支持 https,您需要一个外部 nginx 来实现这一点,我想。或者直接通过 http 访问它,并相信 IP 级别的限制足够好(并信任中间网络)。

不确定我们是否在谈论同一件事。我指的是导出器插件(这个帖子就是关于它的),而不是 Prometheus。导出器似乎不像 Discourse 本身那样处理 IP 检查——否则问题就不应该存在,对吧?

1 个赞

是的。我读得太快了。我不知道为什么它不会获得与 Discourse 相同的 IP 地址。

我现在已经搞定了。看到 @sam 的示例仪表板,我想知道如何获取 Redis 和 PostgreSQL 的数据。很可能需要两个独立的导出器。只是想知道如何在 Discourse 中连接到 PostgreSQL 和 Redis :thinking: