Как организовать несколько серверов Express в одной системе?
Я использую один сервер для размещения нескольких узлов.JS web apps, которые распределены по нескольким доменам. Моя текущая практика состоит в том, чтобы запустить экспресс-сервер для каждого приложения на другом порту и запустить базовый сервер, который просто маршрутизирует (перенаправляет) запросы на правильный порт/Экспресс-сервер. Это работает, но это означает, что мой базовый сервер маршрутизирует каждый HTTP-запрос (и вручную перенаправляет его), и что мои пользователи видят мои приложения как размещенные на [hostname.com]:8000.
после небольшого исследования я обнаружил, что могу использовать http-proxy для моих потребностей маршрутизации, но я все равно хотел бы знать, есть ли лучшая практика для запуска нескольких серверов Express в одной системе. Вот как я планирую это сделать:
каждое веб-приложение будет иметь свою собственную папку с полной структурой папок Express (app.Яш, маршруты, мнения, и т. д.) Приложения будут сгруппированы по домену, поэтому пример структуры папок будет быть:
hostname.com/
app.js
routes/
views/
...
app1/
app1.js
routes/
views/
...
app2
...
hostname2.com/
app.js
routes/
views/
...
Я должна каждого приложения.js отдельно с узлом (или с навсегда, который я в настоящее время использую), и каждый из них должен будет использовать другой порт внутри, с перекрестными перенаправлениями приложений, указываемыми на порт целевого приложения.
вот мой текущий план. Каковы проблемы с ним, и какие подводные камни я должен стараться избегать? Самое главное, есть ли установленное решение этой проблемы-проблема хостинга несколько веб-приложений в одной системе с Node.js / Express?
EDIT: я планирую в конечном итоге использовать WebSockets и HTTPS, и объем пропускной способности, которую может поддерживать моя настройка, имеет для меня мало значения - это сервер разработки (по крайней мере, сейчас). Спасибо Дэвиду Эллису за то, что поднял вопрос о WebSockets.
второе редактирование: спасибо как Эхевутову, так и Дэвиду Эллису за их ответы, которые очень помогли. Я все еще останавливаюсь на общей структуре для моего приложения, и похоже, что этот вопрос рассматривается в некоторой степени этот вопрос StackOverflow
третье редактирование: я прошел путь с момента публикации этого вопроса (хотя мне еще многое предстоит сделать). Проверьте этот файл в моем репозитории на GitHub, который использует то, что я узнал из ответов на этот вопрос!
2 ответов
Так как Express использует подключиться, Я уверен, что вы можете использовать промежуточное программное обеспечение виртуального хоста Connect. Он работает подобно другим модулям 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)
Если Вы дойдете до точки, где одного Экспресс-сервера недостаточно, посмотрите на использование узла.Кластер из API. Если этого также недостаточно, то текущая практика заключается в том, чтобы поставить asnyc обратный прокси-сервер, такой как Nginx перед вашими серверами Express и указать прокси-серверы Express.
Если вам не нужно использовать WebSockets (или любую функцию HTTP 1.1, действительно), вы можете использовать Nginx в качестве прокси-вместо.
преимущество заключается в том, что общая нагрузка NginX может обрабатывать по сравнению с узлом выше (статически компилируется и специализируется на такого рода вещах, в основном), но вы теряете возможность передавать любые данные (отправка меньших кусков за раз).
для меньшего сайта, или если вы не уверены, какие функции вам понадобятся в будущем, это, вероятно лучше придерживаться node-http-proxy
и только переключитесь на NginX, если вы можете продемонстрировать, что прокси-сервер является узким местом на вашем сервере. К счастью, NginX не трудно настроить, если вам это нужно позже.