所以这是我的尝试,我被困住了。 我有一个包含10多个虚拟主机的apache2 Web服务器。所有域都绑定到服务器ip,apache通过虚拟主机路由,因此每个域都获得正确的内容。这已经有好几年了。 现在面临挑战:我现在有一些webApp,在这台服务器上用node.js编写。当我想运行一个应用程序时,我必须调用一些链接,例如: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中的vhosts可以处理其余的....任何想法? 最好 马丁
更新: 好的,所以最后一切正常。这实际上是一个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...');
答案 0 :(得分:1)
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指令告诉虚拟服务器
在代理代码中,请确保正确填充“主机”字段。
答案 1 :(得分:0)
我遇到了类似的解决方案,将节点应用程序代理放在apache后面,但是通过apache 80作为标准虚拟主机运行并连接node.js应用程序:
https://stackoverflow.com/a/30287224/3617531
希望它可以帮助任何人