Nin*_*Evu 1 apache proxy redirect grafana
我把头发拔出来,因为这一定很简单。
我已经将 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>
Run Code Online (Sandbox Code Playgroud)
和我在 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/
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用 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>
Run Code Online (Sandbox Code Playgroud)
到域的 ProxyPass 工作正常,但是如果我使用 IP 地址,它不会转到域,而是尝试将其加载为 IP:3000/application,然后给出 Grafana 错误(带有 {{alert 的空白页面。标题}})
知道我做错了什么以及如何将 IP:3000 重定向到 DOMAIN:3000 (例如 ProxyPass 使用反向代理所做的事情)?
我使用的是 Ubuntu 12.04
我已经做了各种各样的事情,例如添加尾部斜杠,从 apache 和 grafana 配置中删除它们,我每次都使用隐身模式来确保没有缓存,但我只是无法让它在反向代理中工作我试图将 IP 重定向到我在 Grafana 和 ProxyPass 中设置的域。
请帮忙!
我不能 100% 确定这是否是问题所在。不过,让我们尝试一下:尝试删除 ProxyPass 指令后面的斜杠:
ProxyPass /application http://localhost:3000
ProxyPassReverse /application http://localhost:3000
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
domain = example.co
root_url = %(protocol)s://%(domain)s/grafana
Run Code Online (Sandbox Code Playgroud)
接下来,我将解释我所理解的意外行为的原因。为了完整起见,除了代理设置之外,我还添加了某些重写规则所遇到的问题。
那么如果保留斜杠会发生什么呢?
# WRONG!
ProxyPass /application http://localhost:3000/
ProxyPassReverse /application http://localhost:3000/
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您从 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
Run Code Online (Sandbox Code Playgroud)
但是,您的代理设置工作正常,对吧?嗯,部分。它们有一个小斜杠,/导致在您的 Grafana 安装上进行以下查找:
http://localhost:3000//public/build/grafana.dark.css?v5.2.4
http://localhost:3000//application/public/build/vendor.4f5454f867a0cc2fe8dd.js
Run Code Online (Sandbox Code Playgroud)
/注意后面的额外斜杠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]
Run Code Online (Sandbox Code Playgroud)
这给 Grafana 带来了一些有趣的效果:
事实证明,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]
Run Code Online (Sandbox Code Playgroud)
让我知道这是否有帮助:)
| 归档时间: |
|
| 查看次数: |
4887 次 |
| 最近记录: |