Как мне организовать несколько серверов Express в одной системе?

Я использую один сервер для размещения нескольких веб-приложений 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 и Дэвид Эллис за их ответы, оба из которых очень помогли. Я все еще определяю общую структуру своего приложения, и похоже, что этот вопрос был рассмотрен более подробно с помощью этого вопроса Stackru

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

3 ответа

Решение

Поскольку 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.

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

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

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

      const express = require('express')
const cors = require('cors')
server=express()
server2=express()
server.use(cors())
server2.use(cors())

server.get('/',(req,res)=>res.send({"server":"3001","name":"aakash4dev","data":"some data 1"}))
server.get('/blog/:id',(req,res)=>res.send({"server":"3001","name":"aakash4dev","data":"some data 1"}))

server2.get('/',(req,res)=>res.send({"server":"3002","name":"aakash4dev","data":"some data 2"}))
server2.get('/something/',(req,res)=>res.send({"server":"3002","name":"aakash4dev","data":"some data 2"}))

server.listen(3001)
server2.listen(3002)
Другие вопросы по тегам