Raspberry Pi für Node.js konfigurieren

15

Beim Lesen eines Buches über Einzelseiten-Webanwendungen kam ich zu einem Absatz, der mich zum Nachdenken brachte:

Node.js ist nicht blockierend und ereignisgesteuert. Auf den Punkt gebracht bedeutet dies, dass eine einzelne Node.js-Instanz auf bescheidener Hardware Zehntausende von gleichzeitig geöffneten Verbindungen verarbeiten kann , z.

Mir ist der Fall aufgefallen , dass der Raspberry Pi als Rails-Server verwendet wird. Wie wäre es also mit Node.js?

Wie richte ich meinen Raspberry Pi für die Bereitstellung einer Node.js-Anwendung ein?
Hat jemand versucht, gibt es Tipps & Tricks, vielleicht Fallstricke oder Einschränkungen zu berücksichtigen?


Bearbeiten: Um Missverständnisse oder Off- Topic zu vermeiden, konzentrieren wir uns im Kontext von Node.js weiterhin auf den Raspberry Pi:

  1. Wie gut eignet sich der Raspberry Pi für Node-Anwendungen?
  2. Wenn dies der Fall ist, wie kann man den Raspberry Pi für beste Ergebnisse fein abstimmen?
Marius Butuc
quelle
Da es sich bei dem Buch um eine Anwendung für einzelne Seiten handelt, musste node.js dort erscheinen. Ja, es ist möglich, alles mit Node zu bedienen. Aber ich bezweifle, dass dies jemals in einer Produktionsumgebung geschehen wird, da es sehr komplex und unfreundlich werden kann
Piotr Kula
Es ist seltsam, wie Sie Ihre Antwort aktualisiert haben, um 2 spezifische Fragen zu stellen, um Verwirrung zu vermeiden. Markieren Sie dann eine Antwort für die Installation von node.js-. Was war nicht die Frage? Ihre ursprüngliche Frage war, wie man es einrichtet und welche Ratschläge es gibt. Warum habe ich mich überhaupt darum gekümmert? LOL :)
Piotr Kula
1
Sieht so aus, als die Auswahl getroffen wurde, die Sie noch bearbeitet haben. Die Auswahl der Antwort kann genau wie die Antworten bearbeitet werden. Vielen Dank, dass Sie darauf hingewiesen haben. :)
Marius Butuc

Antworten:

14

Node.js auf einem Raspberry Pi bekommen

Du kannst entweder:

  1. Kompilieren Sie Node.js selbst ( ppumkin hat bereits darauf hingewiesen ) - dauert etwa 2 Stunden auf einem Raspberry Pi.
  2. Oder Sie können die Binärdatei v0.8.17 herunterladen

Performance

Ich habe einen kurzen Leistungstest durchgeführt (um einen groben ersten Eindruck zu vermitteln):

  1. Mein Raspberry Pi ist mit der Standardeinstellung memory_split (64) übertaktet (Turbo)

  2. Die Tests wurden über mein lokales Netzwerk (802.11g Wifi) durchgeführt.

  3. Ich habe das Standardbeispiel "Hello World" von der Node.js-Website verwendet:

    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. Apache Bench Einstellungen: ab -r -n 10000 -c 100 http://192.168.0.116:1337/

Daher sind diese Tests nicht repräsentativ für eine normale Webanwendung (sowohl in Bezug auf die Netzwerkverbindung als auch auf die Länge / Komplexität des übertragenen Inhalts).

Ergebnisse

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)

Zum Vergleich habe ich auch nginx auf meinem Raspberry Pi installiert und den gleichen Test mit der Standardeinstellung "Willkommen bei nginx!" HTML-Datei:

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)

Optimieren der Himbeer-Pi-Einstellungen

Verwenden Sie raspi-config, um die folgenden Einstellungen zu ändern:

  1. Setze den memory_split für die GPU auf 16 (niedrigster Wert)
  2. Stellen Sie den Übertaktungsmodus auf "Turbo", um die schnellsten RAM / CPU-Einstellungen zu erhalten
Frederic
quelle
9

Webserver

Node.JS kann als Webserverersatz auf dem Pi verwendet werden, und Sie können problemlos eigenständige oder einseitige Webanwendungen erstellen.

Aber nur zu Ihrer Information, in den meisten realen Anwendungen wird empfohlen, Server wie die moderne nginx, leichte lighttpdoder die klobige, aber voll funktionsfähige zu verwenden apache2! Und dann script node.js, um die Site zu ergänzen.

Offensichtlich sind die Möglichkeiten endlos und alles hängt davon ab, was Sie erreichen möchten.

Himbeer-Pi?

Auf dem Raspberry Pi kann jeder dieser Webserver ausgeführt werden. Es kann auch Node ohne ernsthafte Komplikationen ausführen und ist ohne komplizierte Anpassungen sehr schnell.

Der Raspberry Pi ist sehr leistungsfähig, aber am besten ist es, die Speichersplittung auf Grafik und RAM zu beschränken. Vergessen Sie die Verwendung einer IDE und machen Sie einfach alles über SSH. Wenn Sie wirklich mehr Saft benötigen, setzen Sie einen Kühlkörper auf den BCM-Chip und übertakten Sie ihn, wenn Sie sich sicher fühlen. Eine andere Möglichkeit wäre, mehrere Pi als Cluster zu verwenden, um den Lastenausgleich zu vereinfachen. Hier können Sie sich über Clustering informieren.

Aber müssen Sie wirklich node.js verwenden?

Node.JSsollte verwendet werden, wenn Sie anfangen (oder damit rechnen), Hunderte und Tausende von Anforderungen zu erhalten, für die kleine Datenblöcke in der Datenbank gespeichert, zwischengespeichert oder mit minimalem Server-Overhead zurückgelesen werden müssen. Sie fahren es also mit JS auf dem Client, aber Node.JStatsächlich mit C / C ++. Was passiert also, wenn Sie ein benutzerdefiniertes Modul oder eine bestimmte Änderung im Basiscode benötigen?

In einer Anwendung, die Webseiten bedient, übertrifft node.js Apache normalerweise nicht, beispielsweise bei einzelnen Anforderungen. Die nicht blockierende Funktion von node.js ist großartig, wenn Sie den größten Teil des Tages Tausende von Anfragen pro Sekunde haben. Hier würde Apache blockieren und abstürzen.

Ein echtes Beispiel

Ebay - Während einer Auktion, wenn Sie einen Countdown der letzten 30 Sekunden haben. Sie können mehrere Personen haben, die die Seite kräftig aktualisiert und die Gebote erhöht haben. Hier strahlt node.js, denn heute müssen Sie NICHT mehr aktualisieren. Dies liegt daran, dass der JS sehr häufig (300 bis 600 ms) von allen Clients auf node.js zugreift und in der Lage ist, ein "echtes Auktionserlebnis" zu bieten. Ebay läuft nicht nur auf node.js, sondern auf sehr komplexen Serverfarmen mit Lastenausgleich.

So erstellen und installieren Sie Node.js auf dem Pi *:

Offensichtlich ist nichts falsch daran, node.js anstelle von anderen zu verwenden und wie man node am besten lernt, wenn man nicht auf einem hübschen kleinen Gerät wie dem Pi sitzt. So können Sie den Code selbst kompilieren.

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

update: spätere Versionen von node (aktuelle Version ist v0.8.18) können ohne die folgenden speziellen Schritte erstellt werden

Als nächstes müssen wir den Compiler anweisen, die armv6Architektur für die Kompilierung zu verwenden:

$ 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'],
 },

Kommentieren Sie dann die Zeilen ab der Markierung 157 aus, um die Teile vfp3 und simulator zu entfernen. Da dies ein JSON-ähnliches Objekt ist, denken Sie daran, das Komma in der CPPDEFINESZeile zu entfernen !

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

Dann der übliche Konfigurations-, Make-, Make-Installationsprozess. Hinweis: Ich musste den Speicherort des OpenSSL-Libpath manuell angeben:

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

Das wars, du solltest jetzt ein funktionierendes Node.JS installieren!

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

* Referenzen und Originalartikel

Aber wie in anderen Antworten erwähnt, können Sie einfach eine vorkompilierte Binärdatei herunterladen, die einfach funktioniert.

Schlussfolgerungen

Ein gutes Stück Pi ist nicht schlecht. Sie können auf dem Pi-Just so gut wie alles ausführen. Erwarten Sie keine Leistung auf Produktionsebene.

Piotr Kula
quelle
2
Nun ... Sie haben recht damit, dass Sie Node.js höchstwahrscheinlich mit einem zusätzlichen "Front-End" -Webserver wie Nginx kombinieren möchten. Aber was meinen Sie mit "Sie BRAUCHEN einen C / C ++ - Entwickler"? Solange Sie nicht am Kern von Node.j arbeiten oder plattformabhängige Module schreiben möchten, benötigen Sie überhaupt kein C / C ++. JavaScript ist genug für den üblichen Node.js-App-Entwickler. Wo habe ich dich falsch verstanden?
Golo Roden
Damit war nur gemeint, dass node.js in C / C ++ geschrieben ist. Bei meinen Recherchen zu node.js stieß ich auf viele Websites, die zeigten, wie die Bibliothek erweitert werden kann. Aber das erforderte reines Wissen in C / C ++ - Für die meisten Zwecke ist dies nicht erforderlich - Aber wenn Sie jemals in einer solchen Situation landen, ist node.js die falsche Lösung. Wie es in meinem Fall war.
Piotr Kula
Meine Frage ist auf Raspberry Pi ausgerichtet --- Wie gut eignet sich Raspberry Pi für Node-Anwendungen? Wenn dies der Fall ist, wie kann ich das RPi für beste Ergebnisse optimieren? --- und nicht knotenorientiert --- Wie gut oder schlecht ist Knoten? Aber danke für deine Meinung; Ich bearbeite die erste Frage, um es klarer zu machen.
Marius Butuc
Ja, ich habe Frage 1 beantwortet. Der Pi kann auch node.js und einen vollen LAMP-Stack verarbeiten! Wie kann man es fein abstimmen? Das ist offen für Diskussionen. Bitte geben Sie an, welche Parameter Sie genauer einstellen möchten. Ich habe auch darauf hingewiesen, was meiner Meinung nach bei der Leistung helfen kann.
Piotr Kula
1
Ich stimme zu, wenn Sie Ihre beiden Antworten in diese zusammenführen.
Jivings
1

F: Wie gut eignet sich der Raspberry Pi für Node-Anwendungen?

A: Sehr gut geeignet :) Kein Zweifel.

F: Wenn dies der Fall ist, wie kann man den Raspberry Pi für beste Ergebnisse fein abstimmen?

A: Nicht! Konzentrieren Sie sich darauf, sehr gut gestaltete Knotenanwendungen zu schreiben. Das Optimieren Ihres Anwendungsskripts ist der richtige Weg.

Verwenden Sie einen Proxyserver, zum Beispiel nginex, nur aus einem Grund: Node.JS ist noch in den Kinderschuhen (im Vergleich zu Apache), sodass Sie davon ausgehen können, dass noch Sicherheitsprobleme zu entdecken sind.

Terradon
quelle