#docker #nginx #devops #nginx-reverse-proxy
Вопрос:
Я новичок в докере, Nginx и devops, так что будьте со мной помягче.
Я следовал нескольким руководствам, которые показывают мне, как размещать несколько веб-приложений в контейнерах docker с использованием Nginx и поддоменов. Я не могу создать новую запись A для этого домена, поэтому я не могу использовать поддомены, это должен быть URL. Если бы я мог создать новую запись A, я нашел миллион руководств, которые показывают мне, как разместить ее на ProjectA.example.com но поскольку у меня нет доступа для создания новой записи A для домена, мне нужно найти способ разместить ее на чем-то вроде example.com/ProjectA. Еще одно препятствие заключается в том, что только порт 80 открыт для внешнего доступа, поэтому весь трафик должен проходить через порт 80 и перенаправляться через обратный прокси-сервер на любой порт, с которого перенаправляется контейнер docker.
До сих пор у меня есть конфигурация Nginx, которая выглядит примерно так
server {
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
listen 80;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location /projectA {
proxy_pass http://127.0.0.1:9001/;
}
location /projectB {
proxy_pass http://127.0.0.1:9002/;
}
}
Это помогает мне попасть на домашнюю страницу проекта. Но CSS веб-сайта не загружается, и всякий раз, когда я нажимаю на ссылку, она отправляет меня на что-то вроде example.com/signup вместо example.com/projectA/signup
этого . Я попытался создать местоположение с подстановочными знаками ( location ~ /projectA.*
), но Nginx это не понравилось. Я подумал, что, возможно, есть способ получить что-то вроде того, что если uri-адрес ссылки содержит ProjectA, отправьте их example.com/projectA$uri
, но я не смог найти документацию по синтаксису.
В основном вопрос в том, является ли это хорошим способом решения проблемы, и есть ли у кого-нибудь ссылка на учебник или какую-либо документацию о том, как это сделать?
Комментарии:
1. таким образом, вы не можете изменить проекты, вы не можете изменить порты, вы не можете изменить записи DNS… по-настоящему?
2. Я могу открывать порты, но ни один из них не обращен наружу, за исключением 80. Доступ к записям DNS-это категорическое «нет». Это домен более крупной организации, и они были достаточно любезны, чтобы предоставить мне поддомен своего домена для работы, но я не могу позволить им создавать поддомен моего поддомена для каждого контейнера, который я запускаю. Будет много заменяемых контейнеров и поддоменов, и они не будут предоставлять административные средства для замены этих записей каждый раз, когда что-то создается или удаляется.
3. да, но тогда вам придется изменить проекты, например, вы можете использовать
<base>
тег в HTML, чтобы частично решить эту проблему
Ответ №1:
Использование завершающей косой черты позади местоположения должно это сделать:
location /projectA/ {
proxy_pass http://127.0.0.1:9001/;
ведет /проект/что угодно к http://127.0.0.1:9001/whatever
Если вы хотите использовать регулярное выражение для перезаписи, это что-то вроде этого:
location ~ ^/projectA/(.*)$ {
proxy_pass http://127.0.0.1:9001/$1;
или
location /projectA/ {
rewrite ^/projectA/whatever/(.*)$ /whatever.php?path=$1 break;
proxy_pass http://127.0.0.1:9001/;
}
ведет /проект/что угодно/к http://127.0.0.1:9001/whatever.php?path=foo