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

Размещение нескольких приложений Nodejs в одном домене

Я пытаюсь запустить несколько приложений nodejs (используя экспресс-фреймворк), все они обслуживаются на одном и том же внешнем порту (80), но каждое в подкаталоге.

Например. Я хочу...

NodeJsApplication1 будет доступен по адресу http://www.mydomain.com/NodeJsApplication1

NodeJsApplication2 будет доступен по адресу http://www.mydomain.com/NodeJsApplication2

и т.п.

Я пробовал использовать Nginx в качестве прокси с конфигурацией, подобной следующей.

server {
    listen       80;
    server_name  www.mydomain.com;

    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }

    location /NodeJsApplication1/ {
        proxy_pass http://0.0.0.0:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        rewrite /NodeJsApplication1/(.*) /$1 break;
    }

    location /NodeJsApplication2/ {
        proxy_pass http://0.0.0.0:3001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        rewrite /NodeJsApplication2/(.*) /$1 break;
    }
}

Это работает для доступа к странице, но ломает все относительные URL-адреса на возвращающейся странице. Все скрипты, CSS и т. Д. Указывают на корень (например, www.mydomain.com/styles/main.css).

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

Это вообще возможно?

Обновить

Внутри самих приложений все ссылки используют относительные пути. Например:

Но при отображении браузер рассматривает их как «www.mydomain.com/styles/main.css», а не «www.mydomain.com/NodeJsApplication1/styles/main.css».

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

У меня была аналогичная проблема с несколькими приложениями MEAN в одном домене. Мне нужны подкаталоги вместо того, чтобы создавать новый поддомен для каждого приложения. Помимо добавления перезаписи в конфигурацию Nginx:

rewrite ^/app1/(.*)$ /$1 break;

Вам также необходимо установить свой <base> тег в заголовке вашего индекса:

<base href="/app1/">

из https://www.digitalocean.com/community/questions/how-to-run-multiple-node-application-with-nginx-same-droplet-same-domain

Это должно быть решено в приложениях NodeJS. Большинство хорошо написанных приложений позволяют вам указать корневой URL-адрес, на котором будет размещено приложение, и использовать его для генерации всех локальных URL-адресов, поэтому я предлагаю вам сделать то же самое для вашего приложения.