Configurazione di Raspberry Pi per Node.js


15

Leggendo un libro su applicazioni Web a pagina singola sono arrivato a un paragrafo che mi ha fatto pensare:

Node.js è non bloccante e guidato dagli eventi. In breve, ciò significa che una singola istanza di Node.js su hardware modesto può gestire decine o centinaia di migliaia di connessioni aperte simultanee , come quelle utilizzate nella messaggistica in tempo reale, che è spesso una caratteristica molto desiderata delle moderne SPA.

Ho notato il caso dell'utilizzo di Raspberry Pi come server Rails , quindi che ne dici di Node.js?

Come configuro il mio Raspberry Pi per servire un'applicazione Node.js?
Qualcuno ha provato, ci sono trucchi e suggerimenti, forse aspetti o limitazioni da considerare?


Modifica: per evitare equivoci o argomenti fuori tema, ti preghiamo di concentrarci sul Raspberry Pi, nel contesto di Node.js:

  1. Quanto è adatto Raspberry Pi per le applicazioni Node?
  2. In tal caso, come si può ottimizzare il Raspberry Pi per ottenere i migliori risultati?

Poiché il libro è interamente dedicato all'applicazione a pagina singola, node.js ha dovuto presentarsi lì. Sì, è possibile servire tutto fino al nodo. Ma dubito che sarà mai fatto in qualsiasi ambiente di produzione in quanto può diventare molto complesso e ostile
Piotr Kula

È strano come hai aggiornato la tua risposta per porre 2 domande specifiche per evitare confusione e quindi contrassegnare una risposta per l'installazione di node.js- che non era la domanda? La tua domanda originale era: come impostarla e qualsiasi consiglio. Perché mi sono nemmeno preoccupato. LOL :)
Piotr Kula,

1
Sembra che quando hai fatto la scelta stavi ancora modificando; la scelta della risposta può essere modificata proprio come le risposte, quindi grazie per averlo sottolineato. :)
Marius Butuc il

Risposte:


14

Ottenere Node.js su un Raspberry Pi

Puoi:

  1. Compila te stesso Node.js (come già sottolineato da ppumkin ): impiega circa 2 ore con un Raspberry Pi.
  2. Oppure puoi scaricare il binario v0.8.17

Prestazione

Ho fatto un rapido test delle prestazioni (per dare una prima impressione approssimativa):

  1. My Raspberry Pi è overcloccato (Turbo) con memory_split predefinito (64)

  2. I test sono stati eseguiti sulla mia rete locale (802.11g Wifi).

  3. Ho usato l'esempio "Hello World" standard dal sito 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. Impostazioni di Apache Bench: ab -r -n 10000 -c 100 http://192.168.0.116:1337/

Quindi questi test non sono rappresentativi per una normale applicazione web (sia per quanto riguarda la connessione di rete sia la lunghezza / complessità del contenuto trasferito).

risultati

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)

Per un confronto, ho anche installato nginx sul mio Raspberry Pi ed eseguito lo stesso test con l'impostazione predefinita "Benvenuti in nginx!" File 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)

Ottimizzazione delle impostazioni di Raspberry Pi

Utilizzare raspi-configper modificare le seguenti impostazioni:

  1. Impostare memory_split per la GPU su 16 (valore più basso)
  2. Impostare la modalità di overclocking su "Turbo" per le impostazioni RAM / CPU più veloci

9

Server Web

Node.JS può essere utilizzato come sostituto del server Web sul Pi ed è possibile creare facilmente applicazioni Web singole o singole pagine.

Ma solo per tua informazione, nella maggior parte delle applicazioni del mondo reale si consiglia di utilizzare server come il moderno nginx, leggero lighttpdo grosso ma completo apache2! E poi script node.js per integrare il sito.

Ovviamente le possibilità sono infinite e tutto dipende da ciò che vorresti ottenere.

Raspberry Pi?

Raspberry Pi può eseguire uno di questi server Web. Può anche eseguire Node senza serie complicazioni ed è davvero veloce senza complicate modifiche.

Il Raspberry Pi è molto capace, ma la cosa migliore sarebbe trasformare la memoria divisa in meno grafica e la maggior parte della RAM. Dimentica l'uso di un IDE e fai tutto tramite SSH. Se hai davvero bisogno di un po 'più di succo, metti un dissipatore di calore sul chip BCM e overcloccalo quando ti senti al sicuro. Un'altra opzione sarebbe quella di utilizzare più Pi come cluster per facilitare il bilanciamento del carico. Puoi iniziare a scavare qui sul clustering.

Ma hai davvero bisogno di usare node.js?

Node.JSè stato progettato per essere utilizzato quando si avvia (o si anticipa) per ottenere centinaia e migliaia di richieste che richiedono piccoli blocchi di dati da archiviare nel database, memorizzati nella cache o riletti con un sovraccarico minimo del server. Quindi lo guidi usando JS sul client ma in Node.JSrealtà è guidato da C / C ++. Quindi cosa succede se è necessario un modulo personalizzato o una modifica specifica nel codice di base?

In un'applicazione che serve pagine web node.js di solito non supera apache ad esempio, su singole richieste. La funzione non bloccante di node.js è eccezionale se hai migliaia di richieste al secondo per la maggior parte della giornata, è qui che Apache si bloccherebbe e si arresterebbe in modo anomalo.

Un esempio del mondo reale

Ebay - Durante un'asta quando hai un conto alla rovescia degli ultimi 30 secondi. Puoi avere diverse persone che erano solite aggiornare la pagina con vigore e aumentare le offerte. È qui che brilla node.js, perché oggi NON è più necessario aggiornare. Questo perché JS si annulla molto spesso su node.js (300 ms ~ 600 ms) da tutti i client ed è in grado di fornire un'esperienza di "asta di vita reale". Ebay non funziona solo su node.js ma su server farm con bilanciamento del carico molto complesse.

Per compilare e installare Node.js sul Pi *:

Ovviamente non c'è niente di sbagliato nell'utilizzare node.js invece di altri e il modo migliore per imparare il nodo se non su un piccolo dispositivo pulito come il Pi. Quindi puoi compilare il codice da solo in questo modo.

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

aggiornamento: le versioni successive del nodo (la versione corrente è v0.8.18) possono essere costruite senza i passaggi speciali di seguito

poi dobbiamo dire al compilatore di usare l' armv6architettura per la compilazione:

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

Quindi commentare le righe che iniziano attorno al segno 157, per rimuovere le parti vfp3 e del simulatore. Dato che si tratta di un oggetto simile a JSON, ricordati di rimuovere la virgola sulla CPPDEFINESlinea!

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

Quindi il solito configura, crea, rende il processo di installazione, NB ho dovuto specificare manualmente la posizione del libpath OpenSSL:

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

Ecco fatto, ora dovresti avere un'installazione funzionante di Node.JS!

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

* Riferimenti e articolo originale

Ma come sottolineato in altre risposte, puoi semplicemente scaricare un binario precompilato che funzionerà.

conclusioni

Un buon pezzo di Pi non è male. Puoi eseguire praticamente qualsiasi cosa sul Pi-Just, non aspettarti prestazioni a livello di produzione.


2
Bene ... hai ragione nel voler probabilmente combinare Node.js con un server web "front-end" aggiuntivo come Nginx. Ma cosa intendi con "hai BISOGNO di uno sviluppatore C / C ++"? Finché non si desidera lavorare sul core Node.js o scrivere moduli dipendenti dalla piattaforma, non è necessario C / C ++. JavaScript è sufficiente per lo sviluppatore dell'app Node.js comune. Dove ti ho sbagliato?
Golo Roden,

Tutto ciò che intendevo dire era che node.js è scritto in C / C ++ - Quando stavo facendo ricerche su node.js, mi sono imbattuto in molti siti che hanno dimostrato come espandere la libreria. Ma ciò richiedeva pura conoscenza in C / C ++ - Per la maggior parte degli scopi non sarà necessario - Ma se mai dovessi finire in una situazione del genere, node.js è la soluzione sbagliata. Come è successo nel mio caso.
Piotr Kula,

La mia domanda è focalizzata su Raspberry Pi --- Quanto è adatto Raspberry Pi per servire le applicazioni Node? In tal caso, come posso ottimizzare l'RPi per ottenere i migliori risultati? --- e non focalizzato sul nodo --- Quanto è buono o cattivo il nodo? Ma grazie per la tua opinione; Modificherò la domanda iniziale per renderlo più chiaro.
Marius Butuc,

Sì, ho risposto alla domanda 1- Il Pi è in grado di gestire node.js e anche uno stack LAMP completo! Come ottimizzarlo? Questo è aperto alla discussione. Si prega di essere più specifici quali parametri si desidera ottimizzare? Ho anche ampliato ciò che ritengo possa aiutare con le prestazioni.
Piotr Kula,

1
Valuterò se unirai le tue due risposte in questa.
Jivings,

1

D: Quanto è adatto Raspberry Pi a servire le applicazioni Node?

A: Molto adatto :) Non c'è dubbio.

D: In tal caso, come è possibile ottimizzare Raspberry Pi per ottenere i migliori risultati?

A: Non farlo! Concentrati sulla scrittura di applicazioni nodo ben progettate. L'ottimizzazione dello script delle applicazioni è la strada da percorrere.

Usa sempre un server proxy, ad esempio nginex, solo per un motivo: Node.JS è ancora nella sua infanzia (rispetto ad Apache), quindi puoi presumere che ci siano ancora problemi di sicurezza da scoprire.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.