首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将vhosts与node-http-proxy一起使用?

如何将vhosts与node-http-proxy一起使用?
EN

Stack Overflow用户
提问于 2012-02-21 05:38:59
回答 4查看 10.6K关注 0票数 16

我同时运行Nodejs和Apache。

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

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

代码语言:javascript
复制
<VirtualHost 127.0.0.1>
    DocumentRoot "/localhost/myVhost"
    ServerName myVhost
</VirtualHost>

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

https://github.com/nodejitsu/node-http-proxy (标题为"Proxy requests using a 'Hostname Only‘ProxyTable“部分)

我注意到Connect (据我所知,它捆绑在Express中)有一些vhosts功能。我应该用这句话吗?如果是这样,那么与node-http-proxy一起运行的正确方式是什么?

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

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

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

在不想不知所措的同时,我也遇到了一个叫做"Haibu“的东西,它看起来是相关的,但我不确定它是否只是使用vhosts的全面替代品:

https://github.com/nodejitsu/haibu

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-10 16:42:29

我从来没想过海步或集群。但我确实找到了一个很好的解决方案来解决我的问题。令我惊讶的是,它实际上非常简单。然而,我对服务器了解不多,所以虽然这种方法可以工作,但它可能不是最优的。

我在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的nameVirtualHost (127.0.0.1),而不是使用端口(*:80)。

在Node端,我创建了我的应用程序/服务器(也称为节点虚拟主机),它监听端口8000 (可以随意选择端口号)请参阅使用express:http://expressjs.com/guide.html创建服务器的链接

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

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

nodeHttpProxy.js文件如下所示:

代码语言:javascript
复制
// 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 method

定义新的express虚拟主机

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

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

代码语言:javascript
复制
node nodeHttpProxy.js

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

它将侦听端口80,如果主机与nodeVhosts阵列中的一个名称匹配,它会将请求转发到端口8000上的主机,否则会将请求转发到端口9000上的主机。

票数 11
EN

Stack Overflow用户

发布于 2012-02-21 07:38:25

最近,当我在我的个人测试环境中解决同样的问题时,我一直在思考这个问题。您将无法避免让每个节点应用程序在其自己的端口上运行,但是您可以抽象出该过程的痛苦。这是我现在正在使用的,但我希望围绕这一点构建一个npm包,以便在未来简化事情。

我的每个node.js应用程序都有一个映射文件,其中包含应用程序正在侦听的端口,以及一个映射文件,该映射指示应用程序所在的预期路径。文件的内容如下所示:

代码语言:javascript
复制
{"path": "domain.com/path", "port": 3001}

当我启动我的应用程序时,它将从map.json文件中读取端口并侦听指定的端口。

代码语言:javascript
复制
var map = fs.readFileSync('map.json', 'ascii');
app.listen(map.port);

然后,在我的代理设置中,我遍历我的每个node.js应用程序目录,并检查map.json文件,该文件指示应该将端口80流量代理到该应用程序。

我也使用几乎完全相同的方法为我们的apache托管应用程序设置代理。我们在提供服务的PHP网站上使用基于文件夹的约定,它使用以下配置:

代码语言:javascript
复制
VirtualDocumentRoot /var/www/%-2.0.%-1/%-3+/
VirtualScriptAlias /var/www/%-2.0.%-1/%-3+/cgi-bin/

这基本上允许我们使用以下结构将域映射到文件夹。

代码语言:javascript
复制
http://sub.domain.com/ = /var/www/domain.com/sub/

添加或删除站点不需要额外的配置。这与我目前用来代理apache和node站点的方法非常接近。我可以在不修改这个代理应用程序的情况下添加新节点和新apache站点。

proxy.js

代码语言:javascript
复制
var fs = require('fs');
var httpProxy = require('http-proxy');

var proxyTable = [];

// Map apache proxies
fs.readdirSync('/var/www/').forEach(function(domain) {
    fs.readdirSync('/var/www/' + domain).forEach(function(path) {
        var fqd = domain + '/' + path;
        var port = fs.readFileSync('port', 'ascii');
        proxyTable[fqd] = fqd + ':' + 8080;
    });
});    

// Map node proxies
fs.readdirSync('/var/www-node/').forEach(function(domain) {
        var map = fs.readFileSync('map.json', 'ascii');
        proxyTable.[map.path] = '127.0.0.1:' + map.port;
});

var options = {
    router: proxyTable
};

var proxyServer = httpProxy.createServer(options);
proxyServer.listen(80);

将来,我可能会将路径与应用程序正在侦听的端口解耦,但这种配置允许我只需很少的工作就可以自动构建代理映射。希望这能有所帮助。

票数 6
EN

Stack Overflow用户

发布于 2012-07-26 18:59:24

我从@uglymunky那里获得了一些灵感,并在Ubuntu上写了一个厨师脚本来做这件事。

使用此脚本,您可以在从github下载我的chef项目后,使用一行代码在一台服务器上安装带有vhost支持的express和apache

https://github.com/toranb/ubuntu-web-server

如果你安装了git,然后把它拉下来,你就可以像这样踢开它。

代码语言:javascript
复制
sudo ./install.sh configuration.json

这确实需要Ubuntu 12.04或更高版本,因为我在重启机器时利用了upstart脚本来启动node

脚本完成后,您将拥有一个可以运行的ubuntu web服务器,其中包括运行您配置的任何节点应用程序的express,以及运行您配置的任何wsgi应用程序的apache

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9368794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档