【问题标题】:How can I set up MongoDB on a Node.js server using node-mongodb-native in an EC2 environment?如何在 EC2 环境中使用 node-mongodb-native 在 Node.js 服务器上设置 MongoDB?
【发布时间】:2011-06-14 21:55:37
【问题描述】:

我在这里得到了很多人的帮助,现在我想回馈一下。对于那些在让 Node.js 服务器与 MongoDB 一起工作时遇到问题的人,这就是我所做的。

【问题讨论】:

  • 顺便说一句,这只是冰山一角。我仍然需要探索 1)如何制作复制 mongoDB,2)如何在本地制作复制 mongoDB,3)如何进行分片,4)多实例和负载均衡,5)如何使用 nodejs 服务器管理多个实例,6)如何管理每个实例中的本地数据。有很多事情我要查。 :) 如果您有任何参考,请告诉我。
  • 负载均衡使用HAProxy:stackoverflow.com/questions/4360221/…
  • 如果您计划使用 HAProxy 对节点应用程序进行负载平衡,则 mongodb 需要在其自己的实例上运行。它使您的数据库分片变得容易。
  • 好的。我会看看。你知道如果我使用 AWS 负载均衡服务,它会起作用吗?另外,我仍然不明白一件事。如果每个实例都在本地保存数据,那么这意味着如果我有 10 个实例,那么它将保存在 10 个位置?每个实例可能有不同的数据?
  • 请以问题的形式提出,然后将答案部分移至答案。我很欣赏您尝试做的事情,但请以问答的形式保留。谢谢。

标签: mongodb node.js


【解决方案1】:

这最初是由提问者发布的。一个模组要求他在 cmets 中将其发布为答案,但没有得到回应。所以,我清理了它并自己发布。

查看代码时,您会注意到createServer 代码在db.open 内部。反了就不行了。另外,不要关闭数据库连接。否则,第一次之后,db连接将不会再次打开。 (当然,db.opencreateServer 之外声明。)我不知道为什么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”

运行db进程:

$ ./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 请求调用的位置)。

【讨论】:

  • 谢谢.. 我没有回应,只是误解了模组想要我做什么。 :) 无论如何,谢谢你的帮助。
【解决方案2】:

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

对于拥有 Ubuntu 的人来说,这里是:

# for Gcc
$ sudo apt-get install build-essential

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

然后如上所述安装 node.js 和 mongodb。


另外,经过几个月的开发,我发现使用“npm”、“express”和“mongoose”可以让我的生活更轻松。此外,我还安装了其他工具,例如调试器。

# 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

【讨论】:

    【解决方案3】:

    看起来可能有错误。它不允许我在 collection.insert({

    它将第一个 agument 视为“a”或硬编码的 a,无论哪种方式。

    我会研究这个并在 github 上发布修复

    【讨论】:

    • 我很久以前就发过了。现在我正在使用 Expressjs 和 Mongoose(和蒙古语)。我建议你使用同样的东西,让你的生活更轻松。 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 2022-12-10
    • 2011-10-30
    • 2012-10-05
    相关资源
    最近更新 更多