Configuration du Raspberry Pi pour Node.js


15

En lisant un livre sur les applications Web à page unique, je suis arrivé à un paragraphe qui m'a fait réfléchir:

Node.js est non bloquant et piloté par les événements. En un mot, cela signifie qu'une seule instance Node.js sur un matériel modeste peut gérer des dizaines ou des centaines de milliers de connexions ouvertes simultanées , telles que celles utilisées dans la messagerie en temps réel, ce qui est souvent une caractéristique très souhaitée des SPA modernes.

J'ai remarqué le cas de l' utilisation du Raspberry Pi comme serveur Rails , alors qu'en est-il de Node.js?

Comment configurer mon Raspberry Pi pour servir une application Node.js?
Quelqu'un at-il essayé, y a-t-il des trucs et astuces, peut-être des pièges ou des limitations à considérer?


Edit: Pour éviter les malentendus ou les hors-sujets, concentrons-nous sur le Raspberry Pi, dans le contexte Node.js:

  1. Dans quelle mesure le Raspberry Pi est-il adapté aux applications Node?
  2. Si tel est le cas, comment affiner le Raspberry Pi pour de meilleurs résultats?

Parce que le livre est entièrement consacré à l'application d'une seule page, node.js a dû y apparaître. Oui, il est possible de tout servir avec le nœud. Mais je doute que cela se fasse dans n'importe quel environnement de production car cela peut devenir très complexe et hostile
Piotr Kula

C'est bizarre la façon dont vous avez mis à jour votre réponse pour poser 2 questions spécifiques afin d'éviter toute confusion, puis marquer une réponse pour l'installation de node.js - quelle n'était pas la question? Votre question initiale était, comment l'installer et tout conseil. Pourquoi ai-je même dérangé. LOL :)
Piotr Kula

1
On dirait que lorsque le choix a été fait, vous étiez encore en train de modifier; le choix de la réponse peut être modifié comme les réponses, alors merci de l'avoir signalé. :)
Marius Butuc

Réponses:


14

Obtenir Node.js sur un Raspberry Pi

Vous pouvez soit:

  1. Compilez Node.js vous-même (comme ppumkin l'a déjà souligné ) - prend environ 2 heures sur un Raspberry Pi.
  2. Ou vous pouvez télécharger le binaire v0.8.17

Performance

J'ai fait un test de performance rapide (pour donner une première impression approximative):

  1. Mon Raspberry Pi est overclocké (Turbo) avec un memory_split par défaut (64)

  2. Des tests ont été effectués sur mon réseau local (Wifi 802.11g).

  3. J'ai utilisé l'exemple standard "Hello World" du site Web Node.js:

    var http = require('http');
    http.createServer(function (req, res) {
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end('Hello World\n');
    }).listen(1337, '127.0.0.1');
    console.log('Server running at http://127.0.0.1:1337/');
  4. Paramètres d'Apache Bench: ab -r -n 10000 -c 100 http://192.168.0.116:1337/

Donc , ces tests ne sont pas représentatifs d'une application Web normale ( à la fois en ce qui concerne la connexion réseau et la longueur / complexité du contenu transféré).

Résultats

Server Software:        node.js/0.8.17
Server Hostname:        192.168.0.116
Server Port:            1337

Document Path:          /
Document Length:        12 bytes

Concurrency Level:      100
Time taken for tests:   53.824 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      1130791 bytes
HTML transferred:       120084 bytes
Requests per second:    185.79 [#/sec] (mean)
Time per request:       538.238 [ms] (mean)
Time per request:       5.382 [ms] (mean, across all concurrent requests)
Transfer rate:          20.52 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        2  178 405.2     40    4975
Processing:     7  342 1136.4     50   31533
Waiting:        6  274 1047.6     48   31533
Total:         11  520 1238.7     94   31581

Percentage of the requests served within a certain time (ms)
  50%     94
  66%    112
  75%    303
  80%    714
  90%   1491
  95%   2499
  98%   3722
  99%   5040
 100%  31581 (longest request)

À titre de comparaison, j'ai également installé nginx sur mon Raspberry Pi et effectué le même test avec la valeur par défaut "Bienvenue dans nginx!" Fichier HTML:

Server Software:        nginx/1.2.1
Server Hostname:        192.168.0.116
Server Port:            80

Document Path:          /
Document Length:        151 bytes

Concurrency Level:      100
Time taken for tests:   46.959 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      3610361 bytes
HTML transferred:       1510151 bytes
Requests per second:    212.95 [#/sec] (mean)
Time per request:       469.590 [ms] (mean)
Time per request:       4.696 [ms] (mean, across all concurrent requests)
Transfer rate:          75.08 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        2  162 407.8     40    4999
Processing:     5  256 979.8     45   29130
Waiting:        5  256 979.8     45   29130
Total:         32  418 1078.6     88   30477

Percentage of the requests served within a certain time (ms)
  50%     88
  66%     97
  75%    105
  80%    258
  90%   1064
  95%   2382
  98%   3412
  99%   4145
 100%  30477 (longest request)

Optimiser les paramètres du Raspberry Pi

Utilisez raspi-configpour modifier les paramètres suivants:

  1. Définissez le memory_split pour le GPU sur 16 (valeur la plus basse)
  2. Réglez le mode d'overclocking sur "Turbo" pour les paramètres RAM / CPU les plus rapides

9

Serveurs Web

Node.JS peut être utilisé comme remplacement de serveur Web sur le Pi et vous pouvez facilement créer des applications Web autonomes ou à page unique.

Mais juste pour votre information, dans la plupart des applications du monde réel, il est recommandé d'utiliser des serveurs comme le moderne nginx, le poids léger lighttpdou le gros morceau mais entièrement équipé apache2! Et puis script node.js pour compléter le site.

Évidemment, les possibilités sont infinies et tout dépend de ce que vous souhaitez réaliser.

Tarte aux framboises?

Le Raspberry Pi peut exécuter n'importe lequel de ces serveurs Web. Il peut également exécuter Node sans complications graves et est très rapide sans aucun réglage compliqué.

Le Raspberry Pi est très capable, mais le mieux serait de transformer la mémoire partagée en moindres graphiques et plus de RAM. Oubliez l'utilisation d'un IDE et faites tout simplement via SSH. Si vous avez vraiment besoin de plus de jus, mettez un dissipateur de chaleur sur la puce BCM et overclockez- le comme vous vous sentez en sécurité. Une autre option serait d'utiliser plusieurs Pi en tant que cluster pour aider à l'équilibrage de charge. Vous pouvez commencer à creuser ici à propos du clustering.

Mais avez-vous vraiment besoin d'utiliser node.js?

Node.JSa été conçu pour être utilisé lorsque vous démarrez (ou prévoyez) d'obtenir des centaines et des milliers de demandes qui nécessitent que de petits morceaux de données soient stockés dans la base de données, mis en cache ou relus avec une surcharge minimale du serveur. Vous le pilotez donc à l'aide de JS sur le client, mais il Node.JSest en réalité piloté par C / C ++. Alors, que se passe-t-il si vous avez besoin d'un module personnalisé ou d'un changement spécifique dans le code de base?

Dans une application qui dessert des pages Web, node.js ne surpasse généralement pas apache, par exemple, sur des requêtes uniques. La fonctionnalité non bloquante de node.js est excellente si vous avez des milliers de requêtes par seconde pendant la majeure partie de la journée, c'est là qu'apache se bloquerait et planterait.

Un exemple du monde réel

Ebay - Lors d'une vente aux enchères lorsque vous avez un compte à rebours des 30 dernières secondes. Plusieurs personnes ont pu actualiser la page avec vigueur et augmenter les enchères. C'est là que node.js brille, car aujourd'hui vous n'avez plus besoin de rafraîchir. En effet, le JS ajaxes à node.js très souvent (300 ms ~ 600 ms) de tous les clients et est en mesure de fournir une expérience de «vente aux enchères réelle». Ebay ne fonctionne pas uniquement sur node.js mais sur des batteries de serveurs à charge équilibrée très complexes.

Pour construire et installer Node.js sur le Pi *:

De toute évidence, il n'y a rien de mal à utiliser node.js à la place des autres et la meilleure façon d'apprendre node si ce n'est sur un petit appareil soigné comme le Pi. Vous pouvez donc compiler le code vous-même comme ceci.

$ sudo apt-get install git-core build-essential libssl-dev 
$ mkdir ~/nodeDL && cd ~/nodeDL 
$ git clone https://github.com/joyent/node.git
$ git checkout v0.6.15 (to checkout the most recent stable version at time of writing)

mise à jour: les versions ultérieures du nœud (la version actuelle est la v0.8.18) peuvent être construites sans les étapes spéciales ci-dessous

Ensuite, nous devons dire au compilateur d'utiliser l' armv6architecture pour la compilation:

$ export CCFLAGS='-march=armv6'
$ export CXXFLAGS='-march=armv6'
and then edit deps/v8/SConstruct around the line 82 mark, to add “-march=armv6”:
'all': {
   'CCFLAGS':      ['$DIALECTFLAGS', '$WARNINGFLAGS', '-march=armv6'],
   'CXXFLAGS':     ['-fno-rtti', '-fno-exceptions', '-march=armv6'],
 },

Ensuite, commentez les lignes commençant autour de la marque 157, pour supprimer les parties vfp3 et simulateur. Comme il s'agit d'un objet de type JSON, n'oubliez pas de supprimer la virgule sur la CPPDEFINESligne!

'armeabi:softfp' : {
   'CPPDEFINES' : ['USE_EABI_HARDFLOAT=0']
  # 'vfp3:on': {
  #   'CPPDEFINES' : ['CAN_USE_VFP_INSTRUCTIONS']
  # },
  # 'simulator:none': {
  #   'CCFLAGS':     ['-mfloat-abi=softfp'],
  # }
 },

Ensuite, le processus habituel de configuration, de fabrication, de création d'installation, NB J'ai dû spécifier manuellement l'emplacement du chemin d'accès lib OpenSSL:

$ ./configure --openssl-libpath=/usr/lib/ssl 
$ make (to compile node (This took 103 minutes!))
$ sudo make install 

C'est tout, vous devriez maintenant avoir une installation Node.JS fonctionnelle!

$ node -v should show you the version number
$ npm -v should show you the version of the Node Package Manager

* Références et article original

Mais comme indiqué dans d'autres réponses, vous pouvez simplement télécharger le binaire pré-compilé qui fonctionnera.

Conclusions

Un bon morceau de Pi n'est pas mauvais. Vous pouvez exécuter à peu près n'importe quoi sur le Pi- N'attendez pas les performances au niveau de la production.


2
Eh bien ... vous avez raison, vous voulez très probablement combiner Node.js avec un serveur Web "frontal" supplémentaire tel que Nginx. Mais que voulez-vous dire par "vous avez besoin d'un développeur C / C ++"? Tant que vous ne voulez pas travailler sur le noyau Node.js ou écrire des modules dépendants de la plate-forme, vous n'avez pas du tout besoin de C / C ++. JavaScript est suffisant pour le développeur d'applications Node.js commun. Où t'ai-je trompé?
Golo Roden

Tout ce que je voulais dire par là, c'est que node.js est écrit en C / C ++ - Quand je faisais des recherches sur node.js, je suis tombé sur de nombreux sites qui ont montré comment développer la bibliothèque. Mais cela nécessitait une connaissance pure en C / C ++ - Pour la plupart des utilisations, vous n'en aurez pas besoin - Mais si jamais vous vous retrouviez dans une situation comme celle-ci, alors node.js n'est pas la bonne solution. Comme c'était le cas dans mon cas.
Piotr Kula

Ma question est axée sur le Raspberry Pi --- Dans quelle mesure le Raspberry Pi est-il adapté aux applications Node? Si tel est le cas, comment puis-je affiner le RPi pour de meilleurs résultats? --- et non axé sur les nœuds --- À quel point les nœuds sont- ils bons ou mauvais? Mais merci pour votre avis; Je vais modifier la question initiale pour la rendre plus claire.
Marius Butuc

Oui, j'ai répondu à la question 1- Le Pi peut gérer node.js et une pile LAMP complète aussi! Comment l'affiner? C'est ouvert à la discussion. Veuillez être plus précis quels paramètres vous souhaitez affiner? J'ai également développé ce que je pense pouvoir améliorer les performances.
Piotr Kula

1
Je voterai positivement si vous fusionnez vos deux réponses dans celle-ci.
Jivings

1

Q: Dans quelle mesure le Raspberry Pi est-il adapté aux applications Node?

R: Très bien adapté :) Aucun doute là-dessus.

Q: Si tel est le cas, comment affiner le Raspberry Pi pour de meilleurs résultats?

R: Non! Concentrez-vous sur l'écriture d'applications de nœuds très bien conçues. Optimiser votre script d'applications est la voie à suivre.

Utilisez toujours un serveur proxy, par exemple nginex, pour une seule raison: Node.JS est encore dans ses années d'enfance (par rapport à Apache), vous pouvez donc supposer qu'il y a encore des problèmes de sécurité à découvrir.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.