Подтвердить что ты не робот

Как настроить MongoDB на сервере Node.js, используя node -mongodb-native в среде EC2?

Мне помогли многие люди здесь, и теперь я хочу внести свой вклад. Для тех, у кого возникла проблема с работой сервера Node.js с MongoDB, вот что я сделал.

4b9b3361

Ответ 1

Это было первоначально опубликовано вопросом. Мод спросил его в комментариях, чтобы опубликовать его как ответ, но не получил ответа. Итак, я очистил его и отправил сам.

Когда вы посмотрите на код, вы заметите, что код createServer находится внутри db.open. Это не сработает, если вы отмените его. Кроме того, не закрывать соединение db. В противном случае, после первого раза соединение db не будет открыто снова. (Конечно, db.open объявляется вне createServer.) Я не знаю, почему createServer находится внутри db.open. Думаю, это может быть связано с не открытием слишком большого количества подключений db?

Кроме того, одна проблема, с которой я сталкиваюсь, заключается в том, что когда я запускаю ее через 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

Похоже, может быть ошибка. Это не позволит мне использовать var для первого аргумента в a: b внутри collection.insert({

Он обрабатывает первое приложение как "a" или "жестко закодированное" в любом случае.

Я рассмотрю это и опубликую исправление на github