Nginx: местоположение с proxy_pass, включая uri (Percona PMM)
Я пытаюсь настроить прокси с Nginx для мониторинга и управления Percona (PMM). Я использую их публичный демонстрационный сайт для тестирования.
Цель состоит в том, чтобы выставить интерфейс PMM через URL, например 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;
но это все равно не помогло.
2 ответа
Просмотр источника на демонстрационной странице PMM компании Percona показывает следующее:
<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"
, но некоторые краткие поиски в Google показывают, что это может быть невозможно (я вижу, вы нашли ту же ветку.)
Лучше всего просто использовать другое имя хоста, например percona.local
, Это позволит вам использовать отдельный server
блокировать в Nginx, который делает только прокси все запросы к вашему бэкэнду Percona. Тогда вам не придется беспокоиться о базовых URL, /graph/
, так далее.
Затем, если вы планируете получить доступ к Percona только с локального компьютера, вы можете просто указать любое имя хоста, которое хотите 127.0.0.1
в вашем hosts
файл, и ты в порядке. Если вам нужен какой-либо вид удаленного доступа, например, интрасеть, вам придется немного поработать с DNS.
Проходя от NGINX
Я использовал код, подобный приведенному ниже, для пересылки веб-интерфейса за пределы докера, он также должен работать для вашего использования.
Изменения конфигурации
upstream source {
server source:8081;
}
...
location /source/ {
proxy_pass http://source/;
proxy_set_header Authorization "";
}