【问题标题】:Apache Reverse Proxy not Working with GrafanaApache 反向代理不使用 Grafana
【发布时间】:2017-11-07 04:50:10
【问题描述】:

我拔头发是因为它一定很简单。

我已将 Grafana 设置为通过代理运行子域,该代理运行良好。我也在进行基本身份验证以登录 Grafana,这是我的 apache 配置:

 <VirtualHost *:80>
      ServerAdmin webmaster@example.co
      ServerName example.co
      ServerAlias www.example.co
      DocumentRoot /var/www/example.co/public_html/
      ErrorLog /var/www/example.co/logs/error.log
      CustomLog /var/www/example.co/logs/access.log combined

     <Location "/application">
       AuthType Basic
       AuthName "Graphs Login"
       AuthUserFile /var/www/example.co/members/.htpasswd
       Require valid-user
       ProxyPass http://localhost:3000/
     </Location>
       ProxyPassReverse /application http://example.co:3000/

 </VirtualHost>

还有我在 grafana.ini 中的配置

# The public facing domain name used to access grafana from a browser
domain = example.co

# Redirect to correct domain if host header does not match domain
# Prevents DNS rebinding attacks
;enforce_domain = false

# The full public facing url you use in browser, used for redirects and emails
# If you use reverse proxy and sub path specify full url (with sub path)
root_url = %(protocol)s://%(domain)s:%(http_port)s/application/

我也尝试过使用 301 重定向:

Redirect 301 /application http://example.co/application/
<Location "/application/">
  AuthType Basic
  AuthName "Graphs Login"
  AuthUserFile /var/www/example.co/members/.htpasswd
  Require valid-user
  ProxyPass http://localhost:3000/
  ProxyPassReverse http://localhost:3000/
</Location>

域的 ProxyPass 工作正常,但是如果我使用 IP 地址,它不会进入域,而是尝试将其加载为 IP:3000/应用程序,然后给出 Grafana 错误(空白页{{alert.title}})

知道我做错了什么以及如何将 IP:3000 重定向到 DOMAIN:3000,例如 ProxyPass 正在使用反向代理吗?

我使用的是 Ubuntu 12.04

我已经做了各种各样的事情,例如添加斜杠,从 apache 和 grafana 配置中删除它们,我每次都使用隐身来确保没有缓存,但我无法让它工作在反向代理中,我试图将 IP 重定向到我在 Grafana 和 ProxyPass 中设置的域。

请帮忙!

【问题讨论】:

    标签: apache redirect proxy grafana


    【解决方案1】:

    我不能 100% 确定这是否是问题所在。不过让我们试一试:尝试删除 ProxyPass 指令后的斜线:

    ProxyPass /application http://localhost:3000
    ProxyPassReverse /application http://localhost:3000
    

    Grafana 似乎对那些斜线非常挑剔。我对那些小虫子有几个问题:) 我将在下面进一步解释细节。一个非常简单的工作设置(虽然没有特定的身份验证)如下所示:

    阿帕奇

    <VirtualHost *:443>
        ServerName example.co
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
    
        # grafana
        ProxyPass /grafana http://thorin:3000
        ProxyPassReverse /grafana http://thorin:3000
    </VirtualHost>
    

    格拉法纳

    domain = example.co
    root_url = %(protocol)s://%(domain)s/grafana
    

    说明:斜线

    接下来我解释一下我所理解的意外行为的原因。为了完整起见,除了代理设置之外,我还添加了某些重写规则的问题。

    代理

    如果你保留斜线会发生什么?

    # WRONG!
    ProxyPass /application http://localhost:3000/
    ProxyPassReverse /application http://localhost:3000/
    

    在这种情况下,您从 Grafana 得到的响应是一个丑陋的页面,显示 {{alert.title} 和一堆其他未格式化的 HTML。原因是Grafana无法加载某些资源:

    http://example.co/application/public/build/grafana.dark.css?v5.2.4 
    http://example.co/application/public/build/vendor.4f5454f867a0cc2fe8dd.js
    

    但是,您的代理设置可以正常工作,对吧?好吧,部分。他们有那个小斜线 / 导致在您的 Grafana 安装上进行以下查找:

    http://localhost:3000//public/build/grafana.dark.css?v5.2.4 
    http://localhost:3000//application/public/build/vendor.4f5454f867a0cc2fe8dd.js
    

    注意http://localhost:3000 后面的额外斜线/。尝试调用这些 URL。他们不工作。这是 Grafana 对 URL 非常挑剔的原因 :) 因此,从 Apache 配置中删除多余的斜线就可以了。

    至少到目前为止我是这么想的:)

    重写

    不,重写规则。在我们的设置中,我们在另一个子路径中设置了 Jekyll,比如http://example.co/jekyll,我们使用相对 URL 来访问资源。这需要在每个 URL 的末尾添加一个斜杠。我们通过在 Apache 中添加以下重写规则解决了这个问题(可能有更好的解决方案;如果您有建议,请告诉我):

        # add trailing slashes to support relative URLs
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !(.*)\.[a-zA-Z0-9]+$
        RewriteCond %{REQUEST_URI} !(.*)/$
        RewriteRule ^(.*)$ $1/ [R=301,L]
    

    这对 Grafana 产生了一些有趣的影响:

    • 我们无法登录
    • admin/admin 帐户工作正常,但在更改默认密码时卡住了
    • 所有数据源都已消失

    事实证明,Grafana 不喜欢我们在此处介绍的重定向和斜杠政策。解决方案是只为需要它的应用程序启用此重写规则:

        # add trailing slashes to support relative URLs
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !(.*)\.[a-zA-Z0-9]+$
        RewriteCond %{REQUEST_URI} !(.*)/$
        RewriteCond %{REQUEST_URI} ^jekyll.*$
        RewriteRule ^(.*)$ $1/ [R=301,L]
    

    如果这有帮助,请告诉我:)

    【讨论】:

      猜你喜欢
      • 2021-01-24
      • 2017-07-24
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多