apache - 如何在 node-http-proxy 旁边使用虚拟主机?

标签 apache node.js proxy vhosts express

我正在同时运行 Nodejs 和 Apache。

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

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

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

我的问题是,在 Express/Nodejs 端拥有类似 vhost 的功能的“正确”方式是什么?我宁愿不必像这里建议的那样将每个 Nodejs 应用程序放在自己的端口上:

https://github.com/nodejitsu/node-http-proxy (标题为“使用 'Hostname Only' ProxyTable 的代理请求”部分)

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

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

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

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

虽然不想让人不知所措,但我也遇到了一个叫做“Haibu”的东西,它似乎是相关的,但我不确定它是否只是使用虚拟主机的全面替代品:

https://github.com/nodejitsu/haibu

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

最佳答案

我从来不知道 Haibu 或 Cluster。但我确实找到了一个很好的解决方案来解决我的问题。令我惊讶的是,它实际上非常简单。但是,我对服务器了解不多,所以虽然这可行,但可能不是最佳的。

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

我在 Node 上安装了以下内容

  • express (http://expressjs.com/)
  • node-http-proxy (https://github.com/nodejitsu/node-http-proxy)

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

然后,我将 Apache 切换到监听端口 80 以外的端口。我只是碰巧选择了端口 9000,因为我曾在某处看到过该端口。 (在 httpd.conf 中,将“Listen 80”更改为“Listen 9000”)。我还必须确保我的所有虚拟主机(在 extra/httpd-vhosts.conf 中定义)都设置为基于 IP 的 nameVirtualHost (127.0.0.1) 而不是使用端口 (*:80)。

在 Node 方面,我创建了我的应用程序/服务器(又名 Node 虚拟主机),它在端口 8000 上监听(端口号的任意选择)请参阅此链接以使用 express 创建服务器:http://expressjs.com/guide.html

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

使用 node-http-proxy,在 nodeHttpProxy.js 中,我创建了一个代理服务器,它在端口 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 方法定义一个新的 express 虚拟主机

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

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

node nodeHttpProxy.js

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

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

关于apache - 如何在 node-http-proxy 旁边使用虚拟主机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9368794/

相关文章:

php - Apache Mod 重写对我不起作用 当在 url 中使用 (-) 时?

javascript - 使用 Node.js + Cheerio 进行抓取 - 重复,选择器内的选择器会创建重复的返回

javascript - Firefox 移动设备上的相机访问问题

c# - 检测 WebRequest 的 HTTP 代理错误

apache - 使用代理服务器的 HTTP 到 HTTPS 映射

php - XAMPP - 重新启动 apache 的快速方法?

java - systemctl status tomcat 返回 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java :950)

go - 如何在 golang 中传递 http 请求?

php - UTF-8贯穿始终

javascript - 无法连接到 Mongoose 实验室