Подтвердить что ты не робот

Как организовать несколько серверов 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, который использует то, что я узнал из ответов на этот вопрос!

4b9b3361

Ответ 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 не сложно настроить, если он понадобится вам позже.