Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 如何在节点http代理旁边使用vHost?_Apache_Node.js_Proxy_Vhosts_Express - Fatal编程技术网

Apache 如何在节点http代理旁边使用vHost?

Apache 如何在节点http代理旁边使用vHost?,apache,node.js,proxy,vhosts,express,Apache,Node.js,Proxy,Vhosts,Express,我正在一起运行Nodejs和Apache 节点http代理正在侦听端口80,然后将请求转发到Apache(:9000)或Express(:8000) 我在Apache上的虚拟主机如下所示: <VirtualHost 127.0.0.1> DocumentRoot "/localhost/myVhost" ServerName myVhost </VirtualHost> DocumentRoot“/localhost/myVhost” 服务器名myVh

我正在一起运行Nodejs和Apache

节点http代理正在侦听端口80,然后将请求转发到Apache(:9000)或Express(:8000)

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

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

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

(标题为“使用“仅主机名”代理表的代理请求”的部分)

我注意到Connect(据我所知,它捆绑在Express中)具有一些vhosts功能。我应该用这个吗?如果是这样,那么在节点http代理旁边运行它的正确方法是什么

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

虽然我不想被压倒,但我也遇到了一个名为“Haibu”的软件,它似乎有关联,但我不确定它是否会完全取代vhost:


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

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

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

{"path": "domain.com/path", "port": 3001}
// 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);
当我启动应用程序时,它将从map.json文件中读取端口,并在指定的端口上侦听

var map = fs.readFileSync('map.json', 'ascii');
app.listen(map.port);
然后在我的代理设置中,我迭代每个node.js应用程序目录,并检查map.json文件,该文件指示端口80流量应代理到此应用程序

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

VirtualDocumentRoot /var/www/%-2.0.%-1/%-3+/
VirtualScriptAlias /var/www/%-2.0.%-1/%-3+/cgi-bin/
这本质上允许我们使用以下结构将域映射到文件夹

http://sub.domain.com/ = /var/www/domain.com/sub/
添加或删除站点不需要其他配置。这与我目前用于代理apache和节点站点的方法非常接近。我可以添加新节点和新apache站点,而无需修改此代理应用程序

proxy.js

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);

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

我从来没有想到过海布或集群。但我确实找到了解决我的问题的好办法。令我惊讶的是,这其实很简单。然而,我对服务器了解不多,所以虽然这是可行的,但它可能不是最优的

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

我在节点上安装了以下组件

  • 快车(http://expressjs.com/)
  • 节点http代理(https://github.com/nodejitsu/node-http-proxy)
然后,出于个人风格,我将所有虚拟主机放在一个公共目录(/localhost)中

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

在节点端,我创建了我的应用程序/服务器(也称为节点虚拟主机),该应用程序/服务器在端口8000上侦听(端口号的任意选择)请参见有关使用express创建服务器的链接:

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

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

nodehttproxy.js文件如下所示:

{"path": "domain.com/path", "port": 3001}
// 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);
如您所见,每次创建新节点虚拟主机时,我都必须做两件事:

  • 将虚拟主机名添加到我的“nodeVhosts”阵列
  • 使用.set方法定义新的express虚拟主机
  • 当然,我还必须在我的/localhost目录中创建实际的主机路径/文件

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

    node nodeHttpProxy.js
    
    您可能会遇到一些奇怪的“EACCESS”错误,在这种情况下,只需像sudo一样运行即可


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

    我从@uglymunky获得了一些灵感,并在Ubuntu上编写了一个厨师脚本来完成这项工作

    有了这个脚本,您可以在从github中取出my chef项目后,使用1行代码在单个服务器上安装express和apache,并提供vhost支持

    如果你已经安装了git并且你把它拉下来,你可以像这样启动它

    sudo ./install.sh configuration.json
    
    这确实需要Ubuntu12.04或更高版本,因为我在重启机器时利用了upstart脚本来启动节点


    脚本完成后,您将拥有一个运行的ubuntu web服务器和express,用于运行您配置的任何节点应用程序,以及apache,用于运行您配置的任何wsgi应用程序。我正在开发一个极其精简的、可与您的项目完全隔离的库。基本上,这个想法是