Как организовать несколько серверов Express в одной и той же системе?
Я использую один сервер для размещения нескольких веб-приложений Node.js, которые распространяются по нескольким доменам. Моя нынешняя практика - запустить сервер Express для каждого приложения на другом порту и запустить базовый сервер, который просто перенаправляет (перенаправляет) запросы на правильный порт/экспресс-сервер. Это работает, но это означает, что мой базовый сервер маршрутизирует каждый HTTP-запрос (и вручную перенаправляет его) и что мои пользователи видят мои приложения как размещенные на [hostname.com]: 8000.
После небольшого исследования я обнаружил, что могу использовать http-proxy для моих потребностей маршрутизации, но я все равно как узнать, существует ли лучшая практика для запуска нескольких серверов Express в одной и той же системе. Вот как я планирую это сделать:
Каждое веб-приложение будет иметь свою собственную папку с полной структурой папок Express (app.js, routes, views и т.д.). Приложения будут сгруппированы по домену, поэтому пример структуры папок будет:
hostname.com/
app.js
routes/
views/
...
app1/
app1.js
routes/
views/
...
app2
...
hostname2.com/
app.js
routes/
views/
...
Мне нужно будет запускать каждый app.js отдельно с помощью node (или с forever, который я сейчас используя), и каждый из них должен будет использовать другой порт внутри, причем перекрестные переадресации указываются на порт целевого приложения.
Итак, это мой текущий план. В чем проблемы с этим, и какие подводные камни я должен избегать?
Самое главное, существует ли установленное решение этой проблемы - проблема размещения нескольких веб-приложений в одной системе с помощью Node.js/Express?
EDIT: я планирую в конечном итоге использовать WebSockets и HTTPS, и размер пропускной способности, которую может поддерживать моя установка, для меня не имеет большого значения - это сервер разработки (по крайней мере, на данный момент). Спасибо Дэвиду Эллису за то, что он поднял вопрос о WebSockets.
ВТОРОЙ РЕДАКТИРОВАНИЕ: благодаря Иевутову и Дэвиду Эллису за их ответы, оба из которых очень помогли. Я все еще соглашаюсь на общую структуру моего приложения, и похоже, что этот вопрос подробно рассматривается в qaru.site/info/15812/...
ТРЕТЬЯ РЕДАКТИРОВКА: Я пришел с пути после публикации этого вопроса (хотя мне гораздо дальше идти). Проверьте этот файл в моем репозитории GitHub, который использует то, что я узнал из ответов на этот вопрос!
Ответы
Ответ 1
Так как Express использует Connect, я уверен, что вы можете использовать промежуточное программное обеспечение Connect virtual host. Он работает аналогично другим модулям vhost для других продуктов. У меня нет нескольких доменов для проверки и отображения правильного кода, но я бы подумал, что это примерно так:
express.createServer()
.use(express.vhost('hostname1.com', require('/path/to/hostname1').app)
.use(express.vhost('hostname2.com', require('/path/to/hostname2').app)
.listen(80)
Если вы дойдете до того, что одного Express-сервера недостаточно, изучите использование Node.Cluster из API. Если этого также недостаточно, то текущая практика заключается в том, чтобы поставить обратный прокси asnyc, такой как Nginx, перед вашими экспресс-серверами и указать прокси на ваши серверы Express.
Ответ 2
Если вам не нужно использовать WebSockets (или вообще-то функцию HTTP 1.1), вместо этого вы можете использовать NginX в качестве прокси-сервера.
Преимущество в том, что общая нагрузка, которую NginX может обрабатывать, по сравнению с Node выше (будучи статически скомпилированным и специализированным для такого рода вещей, в основном), но вы теряете возможность потоковой передачи любых данных (отправляя меньшие порции за раз).
Для небольших сайтов или если вы не уверены, какие функции вам понадобятся в будущем, лучше придерживаться node-http-proxy
и переключаться на NginX, только если вы можете продемонстрировать, что прокси является узким местом на вашем сервере. К счастью, NginX не сложно настроить, если он понадобится вам позже.