我正在尝试使用 Nginx 设置代理Percona 监控和管理(PMM)。我正在使用他们的公共演示站点进行测试目的。
目标是通过类似 的 URL 公开 PMM 接口https://localhost.local/pmm
。
server {
listen 443 default_server ssl http2;
server_name localhost;
ssl_certificate /etc/pki/tls/certs/localhost.crt;
ssl_certificate_key /etc/pki/tls/private/localhost.key;
location ^~ /pmm/ {
proxy_pass https://pmmdemo.percona.com/;
rewrite ^/pmm/(.*) /$1 break;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Authorization "";
}
}
那里后端软件上有几个不同的 URL。
目前不是运行正常,我可以404
在浏览器控制台中看到类似这样的 URL 请求https://localhost/graph/public/build/grafana.dark.css?v5.0.4
我尝试添加重写规则:rewrite ^/pmm/(.*) /$1 break;
但这仍然没有帮助。
答案1
查看 Percona 的 PMM 演示页面上的源代码可以发现以下内容:
<base href="/graph/" />
<link rel="stylesheet" href="public/build/grafana.dark.css?v5.0.4">
综合起来,这些就是您提到的 404 URL 的来源。因此,代理服务器对于初始请求工作正常,只是后续请求会得到 404 错误,因为它们没有被定向到代理服务器。
理想的解决方案似乎是改为<base href="/graph/"
,<base href="/pmm/graph"
但谷歌搜索后发现这可能是不可能的(我发现你找到了同一个帖子。)
最好只是使用不同的主机名,例如percona.local
。这将允许您在 Nginx 中使用单独的server
块,该块不执行任何操作,只是将所有请求代理到您的 Percona 后端。然后您不必担心基本 URL、/graph/
等等。
然后,如果您只打算从本地机器访问 Percona,那么您只需127.0.0.1
在hosts
文件中指向您想要的任何主机名即可。如果您需要任何类型的远程访问,例如内部网,那么您必须对 DNS 进行一些调整。
答案2
从 NGINX 传递
我使用类似于下面的代码来转发 docker 外部的 Web UI,它也应该适合您使用。
配置更改
upstream source {
server source:8081;
}
...
location /source/ {
proxy_pass http://source/;
proxy_set_header Authorization "";
}