从 NGINX 传递

从 NGINX 传递

我正在尝试使用 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.1hosts文件中指向您想要的任何主机名即可。如果您需要任何类型的远程访问,例如内部网,那么您必须对 DNS 进行一些调整。

答案2

从 NGINX 传递

我使用类似于下面的代码来转发 docker 外部的 Web UI,它也应该适合您使用。

配置更改

upstream source {
    server source:8081;
}

...

location /source/ {
    proxy_pass   http://source/;
    proxy_set_header Authorization "";
}

相关内容