Запуск Apache с виртуальными хостами за прокси node.js

Так что это моя попытка, я застрял. У меня есть веб-сервер apache2 с более чем 10 виртуальными хостами. Все домены привязаны к IP-адресам серверов, а apache маршрутизирует через виртуальные хосты, поэтому каждый домен получает свой правильный контент. Это работает уже много лет. Теперь проблема: теперь у меня есть несколько веб-приложений, написанных с помощью node.js на этом сервере. Когда я хочу запустить приложение, мне нужно вызвать какую-то ссылку, например: mynodeapp.com:3000, в зависимости от порта, на котором я запускаю приложение. Теперь я хочу, чтобы node.js выполнял всю маршрутизацию вместо apache. Я изменил прослушивание apache на порт 9000 и хочу запустить прокси, написанный на узле, который обрабатывает все запросы на порту 80. Я думал, что это возможно с помощью node-http-proxy. Я подумал, что это больше похоже на пересылку, поэтому я попробовал следующее для приложения Node Proxy:

httpProxy = require('http-proxy');

httpProxy.createServer({
  forward: {
    port: 9000,
    host: 'localhost'
  }
}).listen(80);

Но это похоже на пересылку всего, что не зависит от req.host. У кого-нибудь есть идея, как это сделать? Мне нужно перенаправить (или прокси) входящие URL-адреса (my.domain.com), получить их и перенаправить в целом на порт 9000 (где работает apache2), чтобы виртуальные хосты в apache могли обрабатывать все остальное .... есть идеи? Лучший Мартин

ОБНОВЛЕНИЕ: Итак, в конце все работает нормально. На самом деле это была проблема с apache (неправильное место назначения папки .... как глупо). Ниже я публикую свое довольно хорошее рабочее решение, оно довольно простое:

var httpProxy = require('http-proxy');
var http = require('http');
var util = require('util');
var url = require('url');

var options = {
  target: 'some-domain.com:9000',
  target: 'another-domain.com:9000'
}

var proxy = httpProxy.createProxyServer(options);

http.createServer(function(req, res, err) {
  if(err) console.log(err);
  var host = util.inspect(req.headers.host);
  console.log(req.connection.remoteAddress + ' asks for: ' + host + req.url);

  proxy.web(req, res, function(err) {
    if(err) console.log(err);
  });  
}).listen(80);

console.log('Awesome proxy is listening on port 80...');

person marschro    schedule 05.03.2014    source источник


Ответы (2)


Имя виртуального хоста Apache смотрит на поле Host в заголовке запроса. Все они могут работать на одном и том же IP и порту.

NameVirtualHost *:9000

<VirtualHost *:9000>
  DocumentRoot /var/www/site1
  ServerName site1.com
</VirtualHost>

<VirtualHost *:9000>
  DocumentRoot /var/www/site2
  ServerName site2.com
</VirtualHost>

Директива ServerName различает виртуальные серверы.

В своем прокси-коде убедитесь, что вы правильно заполнили поле «хост».

person Schien    schedule 05.03.2014

Я столкнулся с аналогичным решением, оставив приложения node проксированными за apache, но работая через apache 80 как стандартные виртуальные хосты и подключая приложение node.js:

https://stackoverflow.com/a/30287224/3617531

Надеюсь, это может помочь кому-нибудь

person Alejandro Teixeira Muñoz    schedule 18.05.2015