繁体   English   中英

在node.js代理后面使用虚拟主机运行Apache

[英]Running Apache with virtual Hosts behind node.js proxy

这是我的尝试,我被困住了。 我有一个超过10个虚拟主机的apache2 Web服务器。 所有域都绑定到服务器ip,并且apache通过虚拟主机路由,因此每个域都可以获取正确的内容。 这已经有多年历史了。 现在的挑战是:我现在在该服务器上有一些用node.js编写的webApp。 当我想运行一个应用程序时,我必须调用一些链接,例如:mynodeapp.com:3000,具体取决于运行该应用程序的端口。 我现在希望node.js进行所有路由,而不是apache。 我将apache的监听更改为端口9000,并希望运行用node编写的代理,该代理可处理端口80上的所有请求。我认为使用node-http-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...');

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指令将虚拟服务器区分开

在代理代码中,确保正确填充“主机”字段。

我遇到了一个类似的解决方案,将节点应用程序代理在apache之后,但是作为标准虚拟主机运行在apache 80中并连接node.js应用程序:

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

希望它可以帮助任何人

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM