Comment puis-je configurer MongoDB sur un serveur Node.js en utilisant node-mongodb-native dans un environnement EC2?

J’ai reçu de l’aide de nombreuses personnes ici et je souhaite maintenant y consortingbuer. Pour ceux qui ont des difficultés à faire fonctionner un serveur Node.js avec MongoDB, voici ce que j’ai fait.

Cela a été posté à l’origine par le demandeur de la question. Un mod lui a demandé dans les commentaires de l’afficher comme réponse, mais n’a pas eu de réponse. Donc, je l’ai nettoyé et je l’affiche moi-même.

Lorsque vous regardez le code, vous remarquerez que le code de createServer trouve dans db.open . Cela ne fonctionnera pas si vous l’inversez. En outre, ne fermez pas la connexion à la firebase database. Sinon, après la première fois, la connexion à la firebase database ne sera pas ouverte à nouveau. (Bien entendu, db.open est déclaré en dehors de createServer .) Je ne sais pas pourquoi createServer trouve dans db.open . Je suppose que cela peut avoir à voir avec ne pas ouvrir trop de connexions db?

En outre, un problème auquel je suis confronté est que lorsque je l’exécute via SSH, même si $ node server.js & le serveur en arrière-plan (par exemple, $ node server.js & ), après 2,5 heures, le serveur meurt (mais pas l’instance). Je ne sais pas si c’est à cause de la connexion du terminal ou quoi.

Voici la procédure et le code

Environnement: EC2, AMS-Linux-AMI

Objectif: Prendre une requête HTTP et consigner la requête, l’adresse IP et l’horodatage dans MongoDB.

Pas

1) Après avoir créé l’instance (serveur), installez gcc.

 $ yum install gcc-c++ 

2) Téléchargez les fichiers Node.js et décompressez-les. (J’ai utilisé la version 2.6.)

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

J’ai renommé le dossier décompressé en “nodejs”

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

make prend un long moment …. Après cela, vous pouvez essayer d’exécuter l’exemple dans nodejs.org

3) Installez MongoDB. J’ai installé la version 1.6.5, pas 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/ 

J’ai renommé le dossier “mongodb”

Exécutez le processus de firebase database:

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

Ensuite, si vous le souhaitez, vous pouvez exécuter et essayer la ligne de commande. Reportez-vous au site Web de MongoDB.

4) Je vous recommande de créer votre propre AIM en fonction de votre instance. Cela prendra 20 minutes. Recréez ensuite l’installation et relancez MongoDB.

5) Installez 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 

J’ai renommé le dossier en node-mongodb-native

 $ cd node-mongodb-native $ make 

6) Voici le code pour le serveur:

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

Ce n’est peut-être pas un code parfait , mais il fonctionne. Je ne suis toujours pas habitué au style de codage “nested” ou LISP. C’est pourquoi j’ai sortingché et utilisé global.inData pour transmettre des données. 🙂

N’oubliez pas de mettre res.end("") à l’emplacement approprié (à l’endroit où vous pensez que l’appel de la requête HTTP doit être terminé).

À propos, la réponse que j’ai publiée ci-dessus fonctionne pour CentOS et Fedora.

Pour les personnes qui ont Ubuntu, le voici:

 # for Gcc $ sudo apt-get install build-essential # for SSL $ sudo apt-get install libssl-dev 

Ensuite, installez simplement node.js et mongodb comme décrit ci-dessus.


De plus, après quelques mois de développement, je découvre que l’utilisation de “npm”, “express” et “mongoose” peut me rendre la vie beaucoup plus facile. En outre, j’ai installé d’autres outils, comme le débogueur.

 # 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 

Référence: http://npmjs.org

http://expressjs.com

http://mongoosejs.com

On dirait qu’il pourrait y avoir un bug. Cela ne me permettra pas d’utiliser une var pour le premier argument de a: b dans collection.insert ({

Il traite le premier document comme “un” ou un code codé, de toute façon.

Je vais regarder ça et poster un correctif sur github