Как сделать два и более веб сайтов + бекенд в проекте node.js и запустить под разными доменами?

У меня не супер глубокие знания, поэтому если решите ответить, просьба поподробнее. Возможно я написал полную ерунду, тогда буду благодарен за наводящие вопросы. До этого писал на .net, а в node все немного не так, поэтому:

Есть проект на node.js с одним сайтом и серверной частью. Все сделано в шаблоне express, который сгенерился по умолчанию самим express.js, т.е. сайт лежит в папке public, рядом есть файл server.js, который запускается командой npm server. Далее захожу на страницу localhost:8080 и вижу сайт.
На хостинге так же запускаю npm server, в IIS настраиваю редирект с mydomain.ru на localhost:8080 и все ок.

Пришло время написать еще один сайт, который будет использовать ту же серверную часть и далее мне не понятно вообще ничего, но должно быть два разных доменных имени admin.mydomain.ru и mydomain.ru, а может быть и больше, например, mobile.mydomain.ru

Как это сделать красиво и правильно?

Хостинг под iis просьба не обсуждать, просто принять как должное.
  • Вопрос задан
  • 2810 просмотров
Решения вопроса 1
AlexanderKot
@AlexanderKot Автор вопроса
Напишу свой вариант работающий. Не на 100% подробно и может даже это не супер красиво и правильно, как изначально мечталось, но я думаю нубам со слабым английским поможет понять, в каком направлении думать. В противном случае подобные советы можно найти на стековерфлоу.

Решил сделать так: запускаю node процесс веб приложения + node процесс для его api (типа restful). (на 2 сайта будет 4 процесса и т.д.) Конечно в виде виндоус сервисов с помощью https://nssm.cc/.
В IIS создаю сайт, задаю ему доменное имя, настаиваю 2 перенаправления на порты - 3004 для api и 3003 для веб приложения. Для этого в iis нужно поставить 2 приблуды:
www.iis.net/downloads/microsoft/application-reques...
www.iis.net/downloads/microsoft/url-rewrite
Потом, чтобы настроить rewrite - выбрать сайт и нажать на иконку [Url rewrite], после [Add rule] и выбрать reverse proxy, указать путь типа http://localhost:3003 и ОК
IIS спросит про включение ARR, сказать да. После чего можно в web.config закинуть такой текст, должно заработать.
<configuration>
<system.webServer>
...   
<rewrite>
    <rules>
        <clear />
        <rule name="images">
            <match url="photos/.*" />
            <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
            <action type="None" />
        </rule>
        <rule name="api" stopProcessing="true">
            <match url="api\/.*" />
            <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
            <action type="Rewrite" url="http://localhost:3004/{R:0}" />
        </rule>
        <rule name="web" stopProcessing="true">
            <match url=".*" />
            <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
            <action type="Rewrite" url="http://localhost:3003/{R:0}" />
        </rule>
    </rules>
</rewrite>

Основной запор, почему то был с IIS. Не ехал мопед, хотя там вроде все просто, гуглилось плохо, да и хз что именно не работало.

node процесс web приложения запускаете на порту 3003, в главном файле приложения прописан роутинг примерно такой
app.use('/', express.static(__dirname));  // не уверен, что это нужно
app.use('/js', express.static(__dirname + '/js')); // у меня express.js обрабатывает статику, мне показалось так проще, чем в iis настраивать, иначе на каждый запрос скрипта, стиля и т.д. iis будет пулять Index.html
app.use('/libs', express.static(__dirname + '/libs'));
app.use('/img', express.static(__dirname + '/img'));
app.use('/css', express.static(__dirname + '/css'));
app.use('/photos', express.static(config.photoPath)); // про фото не уверен, что именно работает - правило в iis или это
//во всех остальных случайх возвращается index.html со всеми js файлами spa приложения
app.all('/*', function (req, resp, next) {
    resp.sendfile('index.html', {root: __dirname});  //если при таком подходе, вам в ответ на какие-либо запросы лезет этот index.html, значит либо rewrite в iss не заработал, либо обработка статики в экспрессе с ошибкой сделана.
});


node процесс с приложением, которое является api запускаете на порту 3004
В главном файле будет прописан роутинг на подобии:
app.use('/api/category', yourCategoryHandler);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
madmages
@madmages
Человек прямоходящий
ну если я правильно понял вопрос то ответ таков:
при запросе домена , запрос редиректит на IP который вы укажите в панели регистратора. В ноде уже делать проверку какой домен был запрошен(тупой if() ) и в зависимости от домена уже делать че надо
Ответ написан
Комментировать
Если ипосльзуется iis, тогда рекомендую https://github.com/tjanczuk/iisnode модуль, тогда за старт и расспределение будет отвечать IIS - где собственно вы как обычно создаете сайты и bindings.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы