Как мне организовать несколько серверов Express в одной системе? - PullRequest
45 голосов
/ 17 февраля 2012

Я использую один сервер для размещения нескольких веб-приложений Node.js, которые распределены по нескольким доменам.Моя текущая практика - запускать сервер Express для каждого приложения на отдельном порту и запускать базовый сервер, который просто перенаправляет (перенаправляет) запросы на правильный порт / сервер Express.Это работает, но это означает, что мой базовый сервер маршрутизирует каждый отдельный HTTP-запрос (и перенаправляет его вручную), и что мои пользователи видят мои приложения как размещенные на [hostname.com]: 8000.

ПослеПосле небольшого исследования я обнаружил, что могу использовать http-proxy для своих потребностей в маршрутизации, но я все же хотел бы знать, есть ли лучший способ запуска нескольких серверов Express в одной системе.Вот как я планирую это сделать:

Каждое веб-приложение будет иметь свою собственную папку с полной структурой папок Express (app.js, маршруты, представления и т. Д.). Приложения будут сгруппированы по доменам,поэтому пример структуры папок будет такой:

    hostname.com/
        app.js
        routes/
        views/
        ...
        app1/
            app1.js
            routes/
            views/
            ...
        app2
        ...
    hostname2.com/
        app.js
        routes/
        views/
        ...

Мне придется запускать каждый app.js отдельно с узлом (или с forever , который я сейчас использую), икаждому из них придется использовать свой порт внутри, а перенаправления между приложениями будут указывать на порт целевого приложения.

Итак, это мой текущий план.Каковы проблемы с этим, и какие ловушки я должен попытаться избежать?Самое главное, существует ли устоявшееся решение этой проблемы - проблема размещения нескольких веб-приложений в одной системе с Node.js / Express?

РЕДАКТИРОВАТЬ: я планирую в конечном итоге использоватьWebSockets и HTTPS, а также пропускная способность, которую может поддерживать моя установка, для меня не имеет большого значения - это сервер разработки (по крайней мере, на данный момент).Спасибо Дэвиду Эллису за то, что он поднял вопрос о WebSockets.

ВТОРОЕ РЕДАКТИРОВАНИЕ: Спасибо и EhevuTov, и Дэвиду Эллису за ответы, оба из которых очень помогли.Я все еще определяю общую структуру своего приложения, и похоже, что этот вопрос более подробно рассмотрен в этом вопросе StackOverflow

ТРЕТЬЕ РЕДАКТИРОВАНИЕ.опубликовать этот вопрос (хотя мне еще далеко).Проверьте этот файл в моем репозитории GitHub , который использует то, что я узнал из ответов на этот вопрос!

Ответы [ 2 ]

35 голосов
/ 18 февраля 2012

Поскольку Express использует Connect , я уверен, что вы можете использовать промежуточное программное обеспечение виртуального хоста 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)

Если вы дойдете до точки, когда одного сервера Express недостаточно, посмотрите на использование Node.Cluster из API. Если этого также недостаточно, то в настоящее время рекомендуется размещать обратный прокси-сервер asnyc, такой как Nginx, перед серверами Express и направлять прокси на серверы Express.

6 голосов
/ 17 февраля 2012

Если вам не нужно использовать WebSockets (или на самом деле какую-либо функцию HTTP 1.1), вы можете использовать вместо этого NginX в качестве прокси .

Преимущество заключается в общей загрузке NginXможет обрабатывать по сравнению с Node выше (будучи статически скомпилированным и специализированным для такого рода вещей, в основном), но вы теряете возможность потоковой передачи любых данных (отправляя меньшие порции за раз).

Для меньшего сайта,или если вы не уверены, какие функции вам понадобятся в будущем, лучше придерживаться node-http-proxy и переключаться на NginX, только если вы можете продемонстрировать, что прокси является узким местом на вашем сервере.К счастью, NginX не сложно настроить, если он понадобится вам позже.

...