2011-01-25 34 views
12

我在这里得到了很多人的帮助,现在我想回馈。对于那些无法使Node.js服务器在MongoDB中工作的人来说,这是我所做的。如何在EC2环境中使用node-mongodb-native在Node.js服务器上设置MongoDB?

+0

顺便说一句,这只是冰山一角,我仍然需要探索1)如何制作复制mongoDB,2)如何在本地复制mongoDB,3 )如何实现分片,4)多实例和负载均衡,5)如何使用nodejs服务器管理多个实例,6)如何管理每个实例中的本地数据。有很多事情我必须查找。 :)如果您有任何参考,请让我知道。 – murvinlai 2011-01-25 01:19:47

+0

负载均衡使用HAProxy:http://stackoverflow.com/questions/4360221/haproxy-websocket-disconnection/4737648#4737648 – 2011-01-25 03:08:03

+0

如果您计划使用HAProxy负载平衡您的节点应用程序,需要在自己的实例上运行mongodb。它可以很容易地分解你的数据库。 – 2011-01-25 03:09:19

回答

10

这最初由问题提问者发布。一个国防部在评论中要求他将其作为答案张贴,但没有得到任何回应。所以,我把它清理干净并自己发布。

当您查看代码时,您会注意到createServer代码位于db.open之内。如果您将其撤消,它将不起作用。另外,请不要关闭的db连接。否则,第一次后,db连接将不会再次打开。 (当然,db.open是在createServer之外宣布的。)我不知道为什么createServerdb.open之内。我想这可能与不打开太多的数据库连接有关?

另外,我面对的一个问题是,当我通过SSH运行它时,即使我在后台运行服务器(例如$ node server.js &),2.5小时后,服务器也会死亡(不是实例)。我不确定是因为终端连接还是什么。

下面是该过程&代码

环境:EC2,AMS-Linux的AMI

宗旨:以一个HTTP请求,日志查询,IP和时间戳到MongoDB的。

步骤

1)创建实例(服务器)后,安装gcc。

$ yum install gcc-c++ 

2)下载Node.js文件并解压缩它们。 (我用的2.6版。)

$ curl -O http://nodejs.org/dist/node-v0.2.6.tar.gz 
$ tar -xzf node-v0.2.6.tar.gz 

我改名解压缩文件夹只是“的NodeJS”

$ cd nodejs 
$ sudo ./configure --without-ssl 
$ sudo make 
$ sudo make install 

make需要很长一段时间....之后,你可以尝试在运行中的NodeJS样本.org

3)安装MongoDB。我安装了版本1.6.5,而不是1.7。

$ curl -O http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.6.5.tgz 
$ tar -xzf mongodb-linux-x86_64-1.6.5.tgz 
$ sudo mkdir /data/db/r01/ 

我改名为“MongoDB的”

运行数据库程序的文件夹:

$ ./mongodb/bin/mongod --dbpath /data/db/r01/ 

然后,如果你愿意,你可以运行并尝试在命令行。请参阅MongoDB的网站。

4)我建议您根据您的实例创建您自己的AIM。这将需要20分钟。然后,重新安装并再次运行MongoDB。

5)安装node-mongodb-native

$ curl -O https://download.github.com/christkv-node-mongodb-native-V0.8.1-91-g54525d8.tar.gz 
$ tar -xzf christkv-node-mongodb-native-V0.8.1-91-g54525d8.tar.gz 

我重命名的文件到node-mongodb-native

$ cd node-mongodb-native 
$ make 

6)在此是服务器的代码:

GLOBAL.DEBUG = true; 
global.inData = ''; 
var http = require('http'); 
sys = require("sys"); 

/* set up DB */ 

var Db = require('./node-mongodb-native/lib/mongodb').Db, 
    Connection = require('./node-mongodb-native/lib/mongodb').Connection, 
    Server = require('./node-mongodb-native/lib/mongodb').Server, 
    BSON = require('./node-mongodb-native/lib/mongodb').BSONNative; 

var host = process.env['MONGO_NODE_DRIVER_HOST'] != null ? process.env['MONGO_NODE_DRIVER_HOST'] : 'localhost'; 
var port = process.env['MONGO_NODE_DRIVER_PORT'] != null ? process.env['MONGO_NODE_DRIVER_PORT'] : Connection.DEFAULT_PORT; 
var db = new Db('test01', new Server(host, port, {}), {native_parser:true}); 

db.open(function(err, db) { 
    http.createServer(function (req, res) { 
     res.writeHead(200, {'Content-Type': 'text/plain'}); 

     global.inData = {'p':'', 'url':''}; 

     // get IP address 
     var ipAddress = req.connection.remoteAddress; 
     global.inData.ip = ipAddress; 

     // date time 
     var d = new Date(); 
     var ts = d.valueOf(); 
     global.inData.ts = ts; 

     // get the http query 
     var qs = {}; 
     qs = require('url').parse(req.url, true); 
     if (qs.query !== null) { 
      for (var key in qs.query) { 
       if (key == 'p') { 
        global.inData.p = qs.query[key]; 
       } 
       if (key == 'url') { 
        global.inData.url = qs.query[key]; 
       } 
      } 
     } 

     if (global.inData.p == '' && global.inData.url == '') { 
      res.end(""); 
     } else { 
      db.collection('clickCount', function(err, collection) { 
       if (err) { 
        console.log('is error \n' + err); 
       } 

       collection.insert({'p':global.inData.p, 
        'url':global.inData.url, 
        'ip':global.inData.ip, 
        'ts':global.inData.ts}); 
       res.end(""); 
       //db.close(); // DO NOT CLOSE THE CONNECTION 
      }); 
     } 
    }).listen(8080); 
}); 

console.log('Server running at whatever host :8080'); 

这可能不是完美代码,但它运行。我仍然不习惯“嵌套”或LISP类型的编码风格。这就是为什么我欺骗并使用global.inData来传递数据。 :)

不要忘记把res.end("")放在适当的位置(你认为HTTP请求呼叫应该结束)。

0

顺便说一下,我上面发布的答案适用于CentOS和Fedora。

对于谁拥有Ubuntu的人,那就是:

如上所述
# for Gcc 
$ sudo apt-get install build-essential 

# for SSL 
$ sudo apt-get install libssl-dev 

然后,只需安装的node.js和MongoDB。


此外,发展几个月后,我发现使用“故宫”,“表达”和“猫鼬”可以把我的生活变得更加容易。另外,我安装了其他工具,如调试器。

# Install Node Package Manager 
$ sudo curl http://npmjs.org/install.sh | sh 

# for debugging 
$ sudo npm install node-inspector 

# for Profiling 
$ sudo npm install profile 

# Install Express, the Node.js framework 
$ sudo npm install express 

# Install Template Engines (Now, let’s install Jade, jQuery Templates and EJS. You can pick the one you want) 
$ sudo npm install jade jqtpl ejs 

# XML related, install node-expat and then node-xml2js-expat 
$ sudo apt-get install -y libexpat1-dev 
$ sudo npm install node-xml2js 
$ sudo npm install xml2js-expat 

# Install Mongoose, (Mongo Driver) 
$ sudo npm install mongoose 

参考: http://npmjs.org

http://expressjs.com

http://mongoosejs.com

0

它看起来像有可能是一个错误。它不会让我在使用VAR的第一个参数:内部B collection.insert({

它是治疗第一agument为“A”或A,硬编码,无论哪种方式

。我将研究这个问题并在github上发布一个修复程序

相关问题