使用Node.js Express托pipe多个网站

我在使用不同的域configuration两个不同的Node.js应用程序时遇到了问题。 有两个目录

"/abc/" -> express-admin setup (backend) -> admin.abc.com 

 "/xyz/" -> express setup (frontend) -> abc.com 

我需要admin.abc.com指向expressionpipe理员设置和abc.com来expression设置。 我已经安装了vhost,并且该站点都监听端口80。

已添加

 app.use(vhost('abc.com', app)); // xyz/app.js file app.use(vhost('admin.abc.com', app)); // abc/app.js file 

我的问题:

  • 永远安装,每当我启动这两个应用程序,第二个总是停下来。 我尝试使用不同的端口的两个应用程序,但仍然有相同的错误。 他们单独运行没有问题。

  • 我认为我的设置对于域名转发来说太复杂了。 有更好的build议吗? 可能是我有一个主要的app.js文件,我可以用它来路由域到他们各自的应用程序,而不使用每个应用程序的app.js。

我不知道你是如何使用虚拟主机。 首先用vhost的方法,你只需要运行一个快速的应用程序。 不是两个。 这是一个例子。

 var express = require('express'); var vhost = require('vhost'); /* edit /etc/hosts: 127.0.0.1 api.mydomain.local 127.0.0.1 admin.mydomain.local */ // require your first app here var app1 = require("./app1"); // require your second app here var app2 = require("./app2"); // redirect.use(function(req, res){ // if (!module.parent) console.log(req.vhost); // res.redirect('http://example.com:3000/' + req.vhost[0]); // }); // Vhost app var appWithVhost = module.exports = express(); appWithVhost.use(vhost('api.mydomain.local', app1)); // Serves first app appWithVhost.use(vhost('admin.mydomain.local', app2)); // Serves second app /* istanbul ignore next */ if (!module.parent) { appWithVhost.listen(8000); console.log('Express started on port 8000'); } 

您只需要使用永久启用的vhost来运行主要快递应用程序。

您正在使用相同的networking接口在相同的端口上托pipe应用程序。 所以当第二个应用程序启动时,它总是会find正在使用的端口。 如果您想在同一端口上使用多个应用程序,则每个应用程序都需要有自己的networking接口。 使用vhost时,您仍然需要为每个应用程序监听不同的端口。 查看这个例子的细节。 如果您希望自己的应用完全独立,最好使用node-http-proxy。 这允许您在端口80上托pipe代理,该端口转发请求以expression在不同端口上侦听的应用程序。 如果其中一个应用程序崩溃,它不会崩溃另一个应用程序,不同于虚拟主机方法。 这篇文章给出了一个使用node-http-proxy实现的例子。

感谢@veggiesaurus指向node-http-proxy。 抱歉发布迟到。

这是我如何使用node-http-proxy解决我的问题

文件夹结构:

  • 万维网/
    • server.js
    • abc / [快速设置]
      • app.js
    • xyz / [express-admin setup]
      • node_modules /快递pipe理员/ app.js

“abc”和“xyz”有自己的设置并在端口xxxx:3001和xxxy:3002上运行

我安装了node-http-proxy并添加了以下代码的server.js文件。 推荐这个链接

 var http = require('http'); var httpProxy = require('http-proxy'); var proxy = httpProxy.createProxy(); var options = { 'abc.com': 'http://xxxx:3001', 'xyz.com': 'http://xxxy:3002' } http.createServer(function(req, res) { proxy.web(req, res, { target: options[req.headers.host] }); }).listen(80); 

最后,永远使用运行所有3个应用程序设置永远运行在端口3001,3002和80。