gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:06:52 24 4
gpt4 key购买 nike

所以这是我的尝试,但我被困住了。我有一个 apache2 Web 服务器,有超过 10 个虚拟主机。所有域都绑定(bind)到服务器 IP,并且 apache 通过虚拟主机进行路由,因此每个域都可以获得正确的内容。这已经有效很多年了。现在的挑战是:我现在有一些 Web 应用程序,是在该服务器上用 Node.js 编写的。当我想运行应用程序时,我必须调用一些链接,例如:mynodeapp.com:3000,具体取决于我运行应用程序的端口。我现在希望node.js 来完成所有路由,而不是apache。我改变了apache的监听端口9000,并想运行一个用node编写的代理,它处理端口80上的所有请求。我认为这可以通过node-http-proxy实现。我认为这更像是转发,所以我对 Node 代理应用程序尝试了以下操作:

httpProxy = require('http-proxy');

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

但这似乎转发了独立于 req.host 的所有内容。有人知道如何做到这一点吗?我需要转发(或代理)传入的网址(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 指令区分虚拟服务器

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

关于javascript - 在 Node.js 代理后面使用虚拟主机运行 Apache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22186580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com