一尘不染

如何与node-http-proxy一起使用虚拟主机?

node.js

我正在一起运行Nodejs和Apache。

node-http-proxy正在侦听端口80,然后将请求转发到Apache(:9000)或Express(:8000)。

我在Apache上的虚拟主机如下所示:

<VirtualHost 127.0.0.1>
    DocumentRoot "/localhost/myVhost"
    ServerName myVhost
</VirtualHost>

我的问题是,在Express /
Nodejs端具有虚拟主机功能的“正确”方法是什么?我希望不必像下面建议的那样将每个Nodejs应用程序放在其自己的端口上:

https://github.com/nodejitsu/node-http-
proxy (标题为“使用“仅主机名”代理表的代理请求”部分)

我注意到Connect(据我了解,它捆绑在Express中)具有一些虚拟主机功能。我应该使用那个吗?如果是这样,与node-http-
proxy一起运行它的正确方法是什么?

http://www.senchalabs.org/connect/middleware-
vhost.html

我还注意到了另一个名为“集群”的模块,它似乎是相关的,但是我不确定如何:

http://learnboost.github.com/cluster/

虽然不想让自己不知所措,但我还遇到了一个叫做“ Haibu”的东西,它似乎很相关,但是我不确定这是否可以完全替代使用vhosts:

https://github.com/nodejitsu/haibu

注意:我是前端人员,所以我对很多服务器术语不太熟悉


阅读 214

收藏
2020-07-07

共1个答案

一尘不染

我从来没有想过Haibu或Cluster。但是我确实找到了解决我问题的好的解决方案。令我惊讶的是,这实际上非常简单。但是,我对服务器了解不多,因此虽然可行,但这可能不是最佳选择。

我在Apache上像往常一样设置了虚拟主机(http://httpd.apache.org/docs/2.0/vhosts/examples.html)

我在Node上安装了以下内容

然后,出于个人风格,我将所有虚拟主机都放在一个公共目录(/ localhost)中

然后,我切换了Apache以侦听端口80以外的其他端口。我刚巧选择了端口9000,因为我看到它在某个地方使用过。(在httpd.conf中,将“
Listen 80”更改为“ Listen 9000”)。我还必须确保将我在Extra / httpd-
vhosts.conf中定义的所有虚拟主机都设置为基于IP的名称VirtualHost(127.0.0.1),而不是使用端口(*:80)。

在“节点”端,我创建了我的应用程序/服务器(也称为节点虚拟主机),该应用程序/服务器在端口8000上侦听(以某种方式任意选择端口号),请参见以下使用Express创建服务器的链接:http
//expressjs.com/guide。 html

然后,在我的/ localhost目录中,创建了一个名为“ nodeHttpProxy.js”的文件。

然后,在nodeHttpProxy.js中,使用node-http-
proxy创建了一个侦听端口80的代理服务器。使用express来包装连接(http://www.senchalabs.org/connect/),创建了虚拟主机。

nodeHttpProxy.js文件如下所示:

// Module dependancies
var httpProxy = require('/usr/local/lib/node_modules/http-proxy/lib/node-http-proxy')
, express = require('/usr/local/lib/node_modules/express/lib/express');

// Http proxy-server
httpProxy.createServer(function (req, res, proxy) {

    // Array of node host names
    var nodeVhosts = [
        'vhost1'
        , 'vhost2'
    ]
    , host = req.header('host')
    , port = nodeVhosts.indexOf(host) > -1
        ? 8000
        : 9000;

    // Now proxy the request
    proxy.proxyRequest(req, res, {
        host: host
        , port: port
    });
})
.listen(80);

// Vhosts server
express.createServer()
.use(express.vhost('vhost1', require('./vhost1/app')))
.use(express.vhost('vhost2', require('./vhost2/app')))
.app.listen(8000);

如您所见,每次创建新的Node虚拟主机时,我都必须做两件事:

  1. 将虚拟主机名添加到我的“ nodeVhosts”数组中
  2. 使用.set方法定义新的快速虚拟主机

当然,我还必须在/ localhost目录中创建实际的主机路径/文件。

一旦完成所有这些,我只需要运行nodeHttpProxy.js:

node nodeHttpProxy.js

您可能会收到一些奇怪的“ EACCESS”错误,在这种情况下,只需以sudo身份运行即可。

它将侦听端口80,并且如果主机与nodeVhosts数组中的名称之一匹配,它将把请求转发到端口8000上的该主机,否则它将请求转发到该端口9000上的主机。

2020-07-07