Назад | Перейти на главную страницу

Маршруты или субдомены для нескольких приложений?

Я какое-то время искал в Интернете, но не смог найти окончательного ответа на этот вопрос с точки зрения передовой практики, поэтому было сложно извлечь плюсы и минусы.

У меня есть несколько приложений / местоположений, которые я хочу обслуживать через обратный прокси-сервер nginx

app1 - это чисто статические файлы, то есть js / html / css и т. д. app2 и app3 - это приложения wsgi

В моем текущем решении используются субдомены для дифференциации маршрутизации.

example.com -> app1
app2.example.com -> app2
app3.example.com -> app3 

Затем у меня есть разные серверные блоки в моей конфигурации nginx для каждого приложения на основе имени сервера.

Это работает хорошо, однако я знаю альтернативу достижения разделения по маршрутам, т.е.

example.com/ -> app1
example.com/app2/ -> app2
example.com/app3/ -> app3

Какая практика лучше? Отсутствие поддоменов упрощает управление файлами cookie CORS / Session, а также не требует наличия нескольких записей DNS для поддоменов. Есть ли недостатки у маршрутного подхода? Кажется, что оба этих подхода реализованы в Интернете, так что что является решающим фактором.

Лично я предпочитаю example.com/app1 , example.com/app2 или, может быть, даже на более глубоком уровне, example.com/portal/app[1-N] к app1.example.com и app[2-N].example.com как мне кажется, это кажется совершенно бесшовным.

Но многие разработчики приложений пишут код, исходя из того, что:

  • их единственное приложение будет развернуто
  • их приложение всегда будет разворачиваться в корне URL-адреса.

И это вызовет проблемы, когда вам придется использовать правила обратного прокси для URL-пути, который находится ниже уровня корня. /.

Вероятно, у вас есть несколько разных приложений, которые используют один и тот же базовый URL-адрес, например /js/ /images/ /css/ и т.д. с абсолютными ссылками на ресурсы этих базовых каталогов в их HTML.

Гораздо проще просто сопоставить полный поддомен с одним приложением.

пример

app1 работает на appserver1
app2 работает на appserver2

а в конфигурации nginx у вас есть два блока обратного прокси для сопоставления этих приложений с пространством URL-адресов example.com как example.com/app1 example.com/app2

server {
    listen 80;
    server_name example.com;
    root /var/www/html ; 
    location /app1/ {
         proxy_pass http://appserver1/; 
    }
    location /app2/ {
         proxy_pass http://appserver2/; 
    }
}

Вы можете иметь такую ​​же абсолютную ссылку, например, на

<script src="/js/jquery.js"></script>

в HTML-коде appserver1 / index.html и appserver2 / index.html.

Когда вы просите http://example.com/app1/index.html ваш браузер затем попытается загрузить скрипт и запросить http://example.com/js/jquery.js а потом будет?

URL-адрес /js/jquery.js может отображаться в файл в локальной файловой системе /var/www/html/js/jquery.js, или он вызовет ошибку 404 not found, но определенно не будет обратным проксированием на appserver1. /js/jquery.js

Обратный прокси-сервер не будет автоматически перезаписывать абсолютный URL "/js/jquery.js" на http://example.com/app1/js/jquery.js для app1, и он не будет выполнять аналогичную перезапись в http://example.com/app2/js/jquery.js для app2.

Ты можешь поправить на это но это больно настраивать и поддерживать.

server {
    listen 80;
    server_name example.com;

    access_log /var/log/nginx/example.com-access.log;
    error_log /var/log/nginx/example.com-error.log;
    #because logs are love
    location ~ ^/app3 {
        #--->app3
    }
    location ~ ^/app2 {
        #---> app2
    }
    location / {
        #----> app1
    }
}

Это должна быть общая конфигурация 1 серверный блок с несколькими местоположениями.