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

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

Ответы [ 3 ]

10 голосов
/ 28 января 2011

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

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

Кроме того, одна проблема, с которой я сталкиваюсь, заключается в том, что при запуске через SSH, даже если сервер работает в фоновом режиме (например, $ node server.js &), через 2,5 часа сервер умирает (но не экземпляр).Я не уверен, если это из-за терминального подключения или что.

Вот процедура и код

Среда: EC2, AMS-Linux-AMI

Цель: принять HTTP-запрос и зарегистрировать запрос, IP-адрес и метку времени в MongoDB.

Шаги

1) После создания экземпляра (сервера) установитеНКА.

$ 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');

Это может не быть perfect code, но он работает.Я до сих пор не привык к «вложенному» или LISP-стилю кодирования.Вот почему я обманул и использовал global.inData для передачи данных.:)

Не забудьте поместить res.end("") в соответствующем месте (где, по вашему мнению, следует завершить вызов HTTP-запроса).

0 голосов
/ 09 января 2012

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

Первый обработчик обрабатывается как 'a' или a, жестко запрограммированный в любом случае.

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

0 голосов
/ 19 апреля 2011

Кстати, ответ, который я разместил выше, работает для 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...