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

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

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

Каковы мои варианты для этого?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

// Require 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 вы должны настроить свой первый домен, например:

// Require 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 вы бы настроили свой второй домен, например:

// Require diet
var server = require('diet')

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

Подробнее...

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

У меня есть 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);

Ответ 6

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

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

Ответ 8

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

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

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

Ответ 9

Сначала установите forever и bouncy.

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

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

Используя вечность, дайте команду script запустить bouncy на порт 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
}

Приложения NodeJS1, application2 и application3 выполняются на портах 5000, 5001 и 5002 соответственно.

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

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

Ответ 10

Вот как это сделать, используя 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}')
})

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

Ответ 11

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

Ответ 12

в конце концов, когда вы получаете объект запроса и ответа, вы можете получить домен через "request.headers.host"... (не ip, фактически домен)