Как разместить несколько узлов.JS сайты на одном IP / сервере с разными доменами?


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

Каковы мои варианты, чтобы сделать это?

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

11 68

11 ответов:

выбрать один из:

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

диета.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 ')
});

Подробнее:

тю ... почему вы думаете, что 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 firewall, чтобы сообщить ему о переадресации трафика с порта 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 соответственно.

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

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

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