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

Размещение нескольких приложений 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 для каждого приложения.

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

Обновить

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

<link href="styles/main.css" />
<script src="scripts/app.js" />

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

Обновление 2 я знаю два три возможных (неидеальных) решения этой проблемы.

У меня была аналогичная проблема с несколькими приложениями 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, а не настройки среды. Кажется, что приложение пытается быть умным и получить корень приложения, но не знает, что оно проксируется (или что-то в этом роде).

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

Обновить

Поскольку похоже, что у вас работает прокси-сервер nginx, проблема в вашем приложении, использующем жестко заданные ссылки на основной домен. Это похоже на ограничение, наложенное приложением, и nginx не может вам с этим помочь, потому что он не может узнать, когда вы обращаетесь к файлам, например /css/style.css должен ли он перенаправить его на /NodeJsApplication1 или /NodeJsApplication2.

Старый ответ

Два разных приложения не могут быть привязаны к одному порту в одной системе. Вместо этого вы должны привязать их к разным портам, а затем в конфигурации nginx перейти к конкретному порту приложения, подобному этому (это предполагает, что вы используете 3000 порт для app1 и 3001 порт для приложения2):

location /NodeJsApplication1/ {
    proxy_pass http://0.0.0.0:3000;
    ...
}


location /NodeJsApplication2/ {
    proxy_pass http://0.0.0.0:3001;
    ...
}

По поводу вопроса, файлы изображений css 、 js 、 отсутствуют, вы можете это сделать

если вы используете экспресс-фреймворк, вам нужно добавить эту строку кода

app.enable('trust proxy');

значение по умолчанию для доверенного прокси-сервера отключено.