Konfigurowanie Raspberry Pi dla Node.js

15

Czytając książkę na temat aplikacji internetowych na pojedynczych stronach , doszedłem do akapitu, w którym pomyślałem:

Node.js jest nieblokujący i sterowany zdarzeniami. Krótko mówiąc, oznacza to, że pojedyncze wystąpienie Node.js na skromnym sprzęcie może obsłużyć dziesiątki lub setki tysięcy równoczesnych otwartych połączeń , takich jak te używane w wiadomościach w czasie rzeczywistym, co jest często bardzo pożądaną cechą współczesnych SPA.

Zauważyłem przypadek użycia Raspberry Pi jako serwera Rails , więc co powiesz na Node.js?

Jak skonfigurować Raspberry Pi do obsługi aplikacji Node.js?
Czy ktoś próbował, czy są jakieś porady i sztuczki, być może wpadki lub ograniczenia do rozważenia?


Edycja: Aby uniknąć nieporozumień lub nie-tematów, skupmy się na Raspberry Pi w kontekście Node.js:

  1. Jak dobrze Raspberry Pi obsługuje aplikacje Node?
  2. Jeśli tak, to w jaki sposób można dostroić Raspberry Pi, aby uzyskać najlepsze wyniki?
Marius Butuc
źródło
Ponieważ książka dotyczy przede wszystkim aplikacji jednostronicowej, node.js musiała się tam pojawić. Tak, można obsłużyć wszystko za pomocą węzła. Wątpię jednak, czy kiedykolwiek zostanie to zrobione w każdym środowisku produkcyjnym, ponieważ może stać się bardzo złożone i nieprzyjazne
Piotr Kula,
Dziwne, jak zaktualizowałeś swoją odpowiedź, aby zadać 2 konkretne pytania, aby uniknąć nieporozumień, a następnie zaznaczyć odpowiedź dotyczącą instalacji node.js - które nie było pytaniem? Twoje pierwotne pytanie brzmiało: jak to skonfigurować i jakąkolwiek radę. Dlaczego nawet zawracałem sobie głowę. LOL :)
Piotr Kula
1
Wygląda na to, że kiedy dokonano wyboru, nadal edytowałeś; wybór odpowiedzi można edytować podobnie jak odpowiedzi, więc dziękuję za zwrócenie na to uwagi. :)
Marius Butuc

Odpowiedzi:

14

Pobieranie Node.js na Raspberry Pi

Możesz albo:

  1. Skompiluj sam plik Node.js (jak już wspomniano ppumkin ) - zajmuje około 2 godzin na Raspberry Pi.
  2. Lub możesz pobrać plik binarny v0.8.17

Występ

Zrobiłem szybki test wydajności (aby dać szorstkie pierwsze wrażenie):

  1. My Raspberry Pi jest przetaktowany (Turbo) z domyślną pamięcią_split (64)

  2. Testy przeprowadzono w mojej sieci lokalnej (Wi-Fi 802.11g).

  3. Użyłem standardowego przykładu „Hello World” ze strony 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. Ustawienia ławki Apache: ab -r -n 10000 -c 100 http://192.168.0.116:1337/

Dlatego te testy nie są reprezentatywne dla normalnej aplikacji internetowej (zarówno dotyczącej połączenia sieciowego, jak i długości / złożoności przesyłanej treści).

Wyniki

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)

Dla porównania zainstalowałem także nginx na moim Raspberry Pi i przeprowadziłem ten sam test z domyślnym „Welcome to nginx!” Plik 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)

Optymalizacja ustawień Raspberry Pi

Użyj, raspi-configaby zmienić następujące ustawienia:

  1. Ustaw opcję memory_split dla GPU na 16 (najniższa wartość)
  2. Ustaw tryb przetaktowywania na „Turbo”, aby uzyskać najszybsze ustawienia pamięci RAM / procesora
Frederic
źródło
9

Serwery WWW

Node.JS może być używany jako zamiennik serwera WWW w Pi i możesz z łatwością tworzyć samodzielne lub jednostronicowe aplikacje internetowe.

Ale tylko dla twojej informacji, w większości rzeczywistych aplikacji zaleca się używanie serwerów takich jak nowoczesny nginx, lekki lighttpdlub masywny, ale w pełni wyposażony apache2! A następnie skrypt node.js, aby uzupełnić witrynę.

Oczywiście możliwości są nieograniczone i wszystko zależy od tego, co chcesz osiągnąć.

Raspberry Pi?

Raspberry Pi może obsługiwać dowolny z tych serwerów WWW. Może także uruchamiać Węzeł bez żadnych poważnych komplikacji i jest naprawdę szybki, bez żadnych skomplikowanych poprawek.

Raspberry Pi jest bardzo zdolny, ale najlepiej byłoby zmienić podział pamięci na najmniejszą grafikę i większość pamięci RAM. Zapomnij o używaniu IDE i po prostu rób wszystko przez SSH. Jeśli naprawdę potrzebujesz więcej soku, umieść radiator na chipie BCM i podkręć go, gdy poczujesz się bezpiecznie. Inną opcją byłoby użycie wielu Pi jako klastra, aby pomóc w równoważeniu obciążenia. Możesz zacząć szukać tutaj informacji o klastrowaniu.

Ale czy naprawdę potrzebujesz użyć node.js?

Node.JSbył przeznaczony do użycia podczas uruchamiania (lub przewidywania), aby uzyskać setki i tysiące żądań, które wymagają przechowywania małych ilości danych w DB, buforowania lub ponownego odczytu przy minimalnym obciążeniu serwera. Więc sterujesz nim za pomocą JS na kliencie, ale Node.JStak naprawdę jest obsługiwany przez C / C ++. Co się stanie, jeśli potrzebujesz niestandardowego modułu lub określonej zmiany w kodzie podstawowym?

W aplikacji obsługującej strony node.js zwykle nie przewyższa apache na przykład w przypadku pojedynczych żądań. Nieblokująca funkcja node.js jest świetna, jeśli masz tysiące żądań na sekundę przez większość dnia, w tym miejscu apache blokuje się i ulega awarii.

Przykład z prawdziwego świata

Ebay - Podczas aukcji, gdy odliczasz ostatnie 30 sekund. Możesz mieć kilka osób, które energicznie odświeżały stronę i zwiększały stawki. To tutaj świeci node.js, ponieważ dzisiaj NIE musisz już odświeżać. Wynika to z tego, że JS często pobiera do node.js (300ms ~ 600ms) od wszystkich klientów i jest w stanie zapewnić „aukcję w prawdziwym życiu”. Ebay nie działa wyłącznie z node.js, ale na bardzo złożonych farmach serwerów z równoważeniem obciążenia.

Aby zbudować i zainstalować Node.js na Pi *:

Oczywiście nie ma nic złego w używaniu node.js zamiast innych i jak najlepiej nauczyć się węzła, jeśli nie na schludnym małym urządzeniu, takim jak Pi. Możesz więc samodzielnie skompilować kod w ten sposób.

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

aktualizacja: późniejsze wersje węzła (aktualna wersja to v0.8.18) można zbudować bez specjalnych kroków opisanych poniżej

następnie musimy powiedzieć kompilatorowi, aby użył armv6architektury do kompilacji:

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

Następnie skomentuj linie zaczynające się od znaku 157, aby usunąć części vfp3 i symulatora. Ponieważ jest to obiekt podobny do JSON, pamiętaj, aby usunąć przecinek z CPPDEFINESlinii!

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

Następnie zwykły proces konfiguracji, wykonania, instalacji, NB. Musiałem ręcznie określić lokalizację libpath OpenSSL:

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

Właśnie dlatego powinieneś mieć działającą instalację Node.JS!

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

* Referencje i oryginalny artykuł

Ale jak wskazano w innych odpowiedziach, możesz po prostu pobrać wstępnie skompilowany plik binarny, który po prostu zadziała.

Wnioski

Dobry kawałek Pi nie jest zły. Na Pi możesz uruchomić prawie wszystko - po prostu nie oczekuj wydajności na poziomie produkcyjnym.

Piotr Kula
źródło
2
Cóż ... masz rację, że najprawdopodobniej chcesz połączyć Node.js z dodatkowym „front-endowym” serwerem internetowym, takim jak Nginx. Ale co rozumiesz przez „POTRZEBUJESZ programisty C / C ++”? Tak długo, jak nie chcesz pracować na rdzeniu Node.js ani pisać modułów zależnych od platformy, w ogóle nie potrzebujesz C / C ++. JavaScript jest wystarczający dla wspólnego twórcy aplikacji Node.js. Gdzie cię źle zrozumiałem?
Golo Roden
Chodziło mi o to, że node.js jest napisany w C / C ++ - kiedy prowadziłem badania na node.js, natknąłem się na wiele witryn, które pokazały, jak rozwinąć bibliotekę. Ale to wymagało czystej wiedzy w C / C ++ - W większości przypadków nie musisz - Ale jeśli kiedykolwiek znajdziesz się w takiej sytuacji, wtedy node.js jest złym rozwiązaniem. Tak się stało w moim przypadku.
Piotr Kula
Moje pytanie dotyczy Raspberry Pi --- w jakim stopniu Raspberry Pi służy do obsługi aplikacji Node? Jeśli tak, to jak mogę dostroić RPi, aby uzyskać najlepsze wyniki? --- i nie koncentruje się na Węźle --- Jak dobry lub zły jest Węzeł? Ale dziękuję za twoją opinię; Przeredaguję początkowe pytanie, aby było bardziej jasne.
Marius Butuc
Tak, odpowiedziałem na pytanie 1- Pi może również obsługiwać node.js oraz pełny stos LAMP! Jak to dostroić? To jest otwarte do dyskusji. Proszę sprecyzować, jakie parametry chcesz dostroić? Rozszerzyłem również temat tego, co według mnie może pomóc w wydajności.
Piotr Kula,
1
Będę głosować, jeśli połączysz dwie odpowiedzi w jedną.
Jivings
1

P: W jakim stopniu Raspberry Pi nadaje się do obsługi aplikacji Node?

Odp .: Bardzo dobrze pasuje :) Bez wątpienia.

P: Jeśli tak, to w jaki sposób można dostroić Raspberry Pi, aby uzyskać najlepsze wyniki?

Odp .: Nie! Skoncentruj się na pisaniu bardzo dobrze zaprojektowanych aplikacji węzłowych. Najlepszym rozwiązaniem jest optymalizacja skryptu aplikacji.

Zawsze używaj serwera proxy, na przykład nginex, tylko z jednego powodu: Node.JS jest jeszcze w dzieciństwie (w porównaniu z Apache), więc możesz założyć, że wciąż są problemy bezpieczeństwa.

Terradon
źródło