我想将 Prometheus 置于 Apache 反向代理后面,以进行身份验证和访问控制。这适用于 Debian Stretch 附带的 Prometheus 版本(prometheus --version
表示version 1.5.2+ds (branch: debian/sid, revision: 1.5.2+ds-2+b3)
)和 Apache 2.4。
我已经让 Prometheus 处于监听状态127.0.0.1:9090
(例如根据),并且我的配置netstat -tlpn
中有以下内容:VirtualHost
<Location "/prometheus">
ProxyPass "http://localhost:9090"
ProxyPassReverse "http://localhost:9090"
</Location>
但是,当我访问时,会发生https://my-server.com/prometheus
重定向https://my-server.com/graph
(通过 HTTP 状态代码 302 和Location: /graph
),而当前配置下的反向代理无法提供服务。
我如何更改此版本 Prometheus 的配置)以便对 的访问https://my-server.com/prometheus
能够成功重定向到https://my-server.com/prometheus/graph
,即所有与 Prometheus 相关的“事物”都将在通用 URL 前缀下提供服务/prometheus
?
更新目前令我困惑的是,普罗米修斯的CHANGELOG.md
表示命令行标志-web.route-prefix
是在 1.0.0 版本中引入的,但是 Debian 软件包中/etc/default/prometheus
没有提到这个标志,尽管它提到了许多其他标志(好像它不支持它,尽管表面上是基于 1.5.2 版本)。
答案1
我现在正在运行较新版本的 Prometheus,在 1.X 系列中也有这个版本,
-web.external-url=https://<proxyhost>/prometheus
尝试看看它是否适用于你的版本(我在网上找不到任何旧文档,但有一些旧的 github问题似乎也与此相关)。
答案2
您还必须进行配置--web.route-prefix
。
“http://TOTO/prometheus“--> nginx -->”http://本地主机:9090“--> 普罗米修斯
解决方案是:
-web.external-url=https://<proxyhost>/prometheus --web.route-prefix=/
答案3
即使没有 Prometheus-core 端的“-web.external-url”选项,以下配置也能正常工作。您还可以在同一个 VirtualHost 内重定向警报管理器。因此,/prometheus/ 上是 Prometheus,/manager/ 上是警报管理器
<VirtualHost *:80>
ProxyRequests On
ProxyPreserveHost On
RewriteEngine On
ProxyPass /prometheus/ http://localhost:9090/
ProxyPassReverse /prometheus/ http://localhost:9090/
Redirect "/" "/prometheus/"
ProxyPass /manager/ http://localhost:9093/
ProxyPassReverse /manager/ http://localhost:9093/
Redirect "/#/alerts" "/manager/#/alerts"
</VirtualHost>
答案4
以下针对反向代理的 Apache 配置(仅显示相关部分)解决了我所遇到的问题(虽然方式有点笨拙):
<Location "/">
Redirect "/alerts" "/prometheus/alerts"
Redirect "/api" "/prometheus/api"
Redirect "/config" "/prometheus/config"
Redirect "/flags" "/prometheus/flags"
Redirect "/graph" "/prometheus/graph"
Redirect "/rules" "/prometheus/rules"
Redirect "/static" "/prometheus/static"
Redirect "/status" "/prometheus/status"
Redirect "/targets" "/prometheus/targets"
</Location>
<Location "/prometheus">
ProxyPass "http://localhost:9090"
ProxyPassReverse "http://localhost:9090"
</Location>