多个域上的 Node.js 使用 express.vhosts()

Posted

技术标签:

【中文标题】多个域上的 Node.js 使用 express.vhosts()【英文标题】:Node.js on multiple domains using express.vhosts() 【发布时间】:2012-12-19 15:14:52 【问题描述】:

我又遇到了一个 nodejs 问题,我正在编写一个节点服务器,它允许使用 express.vhost() 在同一系统上运行两个或多个 app.js。但我现在很迷茫。

webhost 服务器是运行 Ubuntu 和 plesk 的专用服务器,我为不同的域分配了 2 个 ip。

xxx.xxx.xxx.123 IP 分配给 domain-one.com xxx.xxx.xxx.xxx.456 分配给 domain-two.com

两者都运行 nodejs 服务器 app.js 并且每个都分配在 /var/www/vhosts/[domain-name]/node/app.js

运行虚拟主机的服务器位于 /var/www/node/server.js 这里是代码

var express = require("express");
var app = express();

app
.use(express.vhost('domain-one.com', require('/var/www/vhosts/domain-one.com/node/app.js').app))
.use(express.vhost('domain-two.com', require('/var/www/vhosts/domain-two.com/node/app.js').app))
.listen(3030);


app.get('/', function(req, res)
  res.send('hello world the server running ');
);

在每个 app.js 中

var express = require('express'),
    routes  = require('./routes');

var app = exports.app = express.createServer();

app.get('/', function(req, res)
  res.send('hello world test file for [domain-name] running');
);

//port 3031 for domain-one.com
//port 3032 for domain-two.com
app.listen(3031); 

然后我运行 node server.js,一切正常,没有错误。

然后我运行一个 netstat -anltp

tcp        0      0 0.0.0.0:3030            0.0.0.0:*               LISTEN      19839/node      
tcp        0      0 0.0.0.0:3031            0.0.0.0:*               LISTEN      19839/node      
tcp        0      0 0.0.0.0:3032            0.0.0.0:*               LISTEN      19839/node  

好的,一切都按我的预期进行(我想),所以我打开浏览器并输入 domain-one.com:3031 和其他选项卡 domain-two.com:3032

但在两个域中都会出现连接超时...当我运行 domain-one.com:3030 时,它会显示:

hello world 正在运行的服务器

但不是在 domain-two.com:3030 它也挂起..

我想了解一下我的服务器和域是如何工作的,以及如何在我的服务器中为不同的 ip/域运行不同的 nodejs 应用程序......

有时 domain-two.com 会打印 domain-one.com app.js 文件 res.send() 应该在另一个域上打印的内容...

我想我现在很困惑......希望你能帮我解决这个问题..

非常感谢

-伊万

【问题讨论】:

你确定你没有在你的代码中做任何其他事情吗?我刚刚使用您的代码设置了一个基本应用程序,它运行良好。你连接3030时输入的域名是准确的吗?没有多余的www. 或任何东西,对吧? 是.. 如果我从每个域单独运行 app.js(节点 app.js),则 domain-one.com:3031 挂起,但如果我去 domain-two.com :3031 ...它确实加载正确:S奇怪 var/www/ 目录是apache服务器吗?我很想看看你是如何解决这个问题的,因为我正在尝试同样的事情。在我看来,我需要将我的每个 IP 映射到一个唯一的端口,并让节点服务器在该端口上侦听。 【参考方案1】:

使用这种简单而精确的语法可能会更好:https://github.com/expressjs/vhost

//
// Module dependencies
//
var express = require('express');
var vhost = require('vhost');
var app = express();


//
// vhosts
//
app
  .use(vhost('app1.io', require('./app1/app.js')))
  .use(vhost('app2.io', require('./app2/app.js')))
  .use(vhost('app3.io', require('./app3/app.js')))
  .listen(8080);

【讨论】:

以上是关于多个域上的 Node.js 使用 express.vhosts()的主要内容,如果未能解决你的问题,请参考以下文章

使用 passport.js 和 express.js (node.js) 制作安全的 oauth API

Node.JS、Express 和 MongoDB :: 多个集合

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

如何使用在 node.js 上的方法和 express 来获取更新信息

没有 Express.js 的 node.js 上的 Access-Control-Allow-Origin

如何为 80 端口上的网站制作 Node.js 多租户?