Как разместить несколько узлов Node.js на одном и том же IP-сервере с разными доменами?

У меня есть Linux-сервер с одним IP-интерфейсом. Я хочу разместить несколько узлов Node.js на этом сервере на этом IP-адресе, каждый (очевидно) с уникальным доменом или поддоменом. Я хочу, чтобы все они были на порту 80.

Какие у меня варианты?

Очевидным решением, по-видимому, является то, что все домены обслуживаются веб-приложением node.js, которое действует как прокси-сервер и выполняет переход к другим приложениям node.js, работающим на уникальных портах.

Выберите один из:

  • Используйте другой сервер ( например, nginx ) в качестве обратного прокси.
  • Используйте node-http-proxy в качестве обратного прокси.
  • Используйте промежуточное ПО vhost, если каждый домен может обслуживаться из одной и той же кодовой базы Connect / Express и экземпляра node.js.

Diet.js имеет очень хороший и простой способ разместить несколько доменов с одним и тем же экземпляром сервера. Вы можете просто вызвать новый server() для каждого из ваших доменов.

Простой пример

 // Reuire diet var server = require('diet'); // Main domain var app = server() app.listen('http://example.com/') app.get('/', function($){ $.end('hello world ') }) // Sub domain var sub = server() sub.listen('http://subdomain.example.com/') sub.get('/', function($){ $.end('hello world at sub domain!') }) // Other domain var other = server() other.listen('http://other.com/') other.get('/', function($){ $.end('hello world at other domain') }) 

Разделение ваших приложений

Если вы хотите иметь разные папки для своих приложений, тогда у вас может быть такая структура папок, как эта:

 /server /yourApp /node_modules index.js /yourOtherApp /node_modules index.js /node_modules index.js 

В /server/index.js вам потребуется каждое приложение в папке:

 require('./yourApp') require('./yourOtherApp') 

В /server/yourApp/index.js вы должны настроить свой первый домен, например:

 // Reuire diet var server = require('diet') // Create app var app = server() app.listen('http://example.com/') app.get('/', function($){ $.end('hello world ') }) 

И в /server/yourOtherApp/index.js вы настроили бы свой второй домен, например:

 // Reuire diet var server = require('diet') // Create app var app = server() app.listen('http://other.com/') app.get('/', function($){ $.end('hello world at other.com ') }); 

Прочитайте больше:

  • Узнайте больше о Diet.js
  • Узнайте больше о виртуальных хостах в Diet.js

Хм … почему вы думаете, что nodejs должен действовать как прокси. Я предлагаю запустить несколько приложений для узлов, прослушивающих разные порты. Затем используйте nginx для пересылки запроса в правый порт. Если вы используете один nodejs, у вас будет также одна точка отказа. Если это приложение выйдет из строя, все сайты опустится.

Используйте nginx в качестве обратного прокси.

http://www.nginxtips.com/how-to-setup-nginx-as-proxy-for-nodejs/

Nginx предоставляет целый ряд преимуществ вашим приложениям в виде кеширования, статической обработки файлов, ssl и балансировки нагрузки.

У меня есть API, который я использую на сайте, а ниже – моя конфигурация. У меня также есть SSL и GZIP, если кому-то это нужно, просто прокомментируйте меня.

 var http = require('http'), httpProxy = require('http-proxy'); var proxy_web = new httpProxy.createProxyServer({ target: { host: 'localhost', port: 8080 } }); var proxy_api = new httpProxy.createProxyServer({ target: { host: 'localhost', port: 8081 } }); http.createServer(function(req, res) { if (req.headers.host === 'http://www.domain.com') { proxy_web.proxyRequest(req, res); proxy_web.on('error', function(err, req, res) { if (err) console.log(err); res.writeHead(500); res.end('Oops, something went very wrong...'); }); } else if (req.headers.host === 'http://api.domain.com') { proxy_api.proxyRequest(req, res); proxy_api.on('error', function(err, req, res) { if (err) console.log(err); res.writeHead(500); res.end('Oops, something went very wrong...'); }); } }).listen(80); 

Если вы используете connect / express server, вы можете увидеть промежуточное ПО vhost . Это позволит использовать несколько доменов (поддоменов) для адреса сервера.

Вы можете следовать приведенному здесь примеру, который выглядит точно так, как вам нужно.

Лучший способ сделать это – использовать промежуточное ПО vhost Express. Ознакомьтесь с этим учебным пособием для пошагового объяснения:

http://shamadeh.com/blog/web/nodejs/express/2014/07/20/ExpressMultipleSites.html

Это мой самый простой демонстрационный проект без какого-либо промежуточного программного обеспечения или прокси.
Для этого требуется всего несколько кодов, и этого достаточно.

https://github.com/hitokun-s/node-express-multiapp-demo

С помощью этой структуры вы можете легко настраивать и поддерживать каждое приложение независимо.
Надеюсь, это поможет вам.

Сначала установите навсегда и бодрящий .

Затем напишите сценарий запуска. В этом скрипте добавьте правило к утилите брандмауэра iptables, чтобы сообщить ему перенаправить трафик на порт 80 на порт 8000 (или что-нибудь еще, что вы выберете). В моем примере 8000 – это то, где я запускаю bouncy

 sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8000 

Используя навсегда, давайте скажем сценарию, чтобы он работал на портах 8000

 forever start --spinSleepTime 10000 /path/to/bouncy /path/to/bouncy/routes.json 8000 

Маршруты.json бы что-то вроде

 { “subdomain1.domain.com" : 5000, “subdomain2.domain.com" : 5001, “subdomain3.domain.com" : 5002 } 

NodeJS application1, application2 и application3 работают на портах 5000, 5001 и 5002 соответственно.

Сценарий, который я использую в моем случае, можно найти здесь, и вам, возможно, придется немного поменять его в своей среде.

Я также писал об этом более подробно, и вы можете найти его здесь .

Вот как это сделать, используя vanilla Node.js:

 const http = require('http') const url = require('url') const port = 5555 const sites = { exampleSite1: 544, exampleSite2: 543 } const proxy = http.createServer( (req, res) => { const { pathname:path } = url.parse(req.url) const { method, headers } = req const hostname = headers.host.split(':')[0].replace('www.', '') if (!sites.hasOwnProperty(hostname)) throw new Error(`invalid hostname ${hostname}`) const proxiedRequest = http.request({ hostname, path, port: sites[hostname], method, headers }) proxiedRequest.on('response', remoteRes => { res.writeHead(remoteRes.statusCode, remoteRes.headers) remoteRes.pipe(res) }) proxiedRequest.on('error', () => { res.writeHead(500) res.end() }) req.pipe(proxiedRequest) }) proxy.listen(port, () => { console.log(`reverse proxy listening on port ${port}`) }) 

Довольно просто, да?

Это руководство от цифрового океана – отличный способ. Он использует модуль pm2, который демонзирует ваше приложение (запускает их как службу). Нет необходимости в дополнительных модулях, таких как Forever, потому что он автоматически перезапустит ваше приложение, если оно сработает. Он имеет множество функций, которые помогают отслеживать различные приложения, запущенные на вашем сервере. Это очень здорово!

  • req.body пуст в сообщениях
  • Как обернуть буфер как stream stream2 Readable?
  • Не удается установить узловые модули, требующие компиляции в Windows 7 x64 / VS2012
  • Связь между двумя различными процессами в Node.js
  • Mongoose (mongodb) пакетная вставка?
  • Заменить строку в файле с помощью nodejs
  • Что делает тело-парсер с выражением?
  • Как связать переменное количество обещаний в Q, по порядку?
  • Как правильно проверить обещания с моккой и чаем?
  • Обновите Node.js до последней версии на Mac OS
  • Невозможно выбросить ошибку из функции выполнения асинхронного обещания
  • Interesting Posts

    Vista Брандмауэр Windows – как заблокировать все порты отдельно от 1 в определенной подсети?

    Прокси PuTTY X11: предпринят неправильный протокол авторизации

    Предупреждать пользователя о несохраненных изменениях перед выходом на страницу

    Дженерики: кастинг и типы значений, почему это незаконно?

    Сделать Windows 10 автоматически прекратить установку драйверов

    Смешивание Objective-C и C ++

    JSF 1.2: Как сохранить обработанный обработанный bean-компонент в режиме реального времени через обратную связь на одном представлении?

    Как запустить пакетный скрипт без использования расширения * .bat

    Прагма в определении макроса

    Интеграция tomcat и eclipse в качестве среды для быстрого развертывания

    Установка VMware Player через MSI не удалась

    Объединение нескольких модулей DIMM в один канал памяти

    Сравнение двух массивов объектов и исключение элементов, которые соответствуют значениям в новый массив в JS

    Является ли «NT AUTHORITY \ SYSTEM» пользователем или группой?

    Как я могу заставить rJava использовать новую версию java для osx?

    Давайте будем гением компьютера.