Несколько Контейнеров Docker, Размещенных В Nginx, С URL-Адресом Вместо Поддомена

#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