Налаштування Raspberry Pi для Node.js


15

Читаючи книгу на веб-програмах для однієї сторінки, я прийшов до абзацу, який надумав мене:

Node.js не блокує та керує подіями. Коротше кажучи, це означає, що один екземпляр Node.js на скромному апаратному забезпеченні може обробляти десятки або сотні тисяч одночасно відкритих з'єднань , таких як ті, які використовуються в обміну повідомленнями в реальному часі, що часто є дуже бажаною особливістю сучасних SPA-систем.

Я помітив випадок використання Raspberry Pi як сервера Rails , то як щодо Node.js?

Як налаштувати Raspberry Pi для обслуговування програми Node.js?
Хто-небудь спробував, чи є поради та підказки, можливо, є питання чи обмеження?


Редагувати: Щоб уникнути непорозумінь або позатематичних питань, давайте не забудьте зосередити увагу на Raspberry Pi в контексті Node.js:

  1. Наскільки Raspberry Pi підходить для обслуговування програм Node?
  2. Якщо це так, як можна тонко налаштувати Raspberry Pi для досягнення найкращих результатів?

Оскільки книга стосується програми на одній сторінці, node.js повинен був з’явитись там. Так, можна обслуговувати все до вузла. Але я сумніваюся, що це буде коли-небудь робити в будь-яких виробничих умовах, оскільки це може стати дуже складним і недружелюбним
Пьотр Кула,

Дивно, як ви оновили відповіді, щоб задати 2 конкретні питання, щоб уникнути плутанини, а потім позначили відповідь про встановлення node.js- що не було питанням? Ви оригінальним запитанням було, як його встановити та будь-які поради. Чому я навіть набридла. LOL :)
Piotr Kula

1
Схоже, коли було зроблено вибір, ви все ще редагували; вибір відповіді можна редагувати так само, як і відповіді, тому дякую, що вказали на це. :)
Маріус Бутук

Відповіді:


14

Отримання Node.js на Raspberry Pi

Ви можете:

  1. Складіть Node.js самостійно (як уже вказував ppumkin ) - займає близько 2 годин на Raspberry Pi.
  2. Або ви можете завантажити binary v0.8.17

Продуктивність

Я зробив швидкий тест на працездатність (щоб скласти грубе перше враження):

  1. Мій Raspberry Pi розігнаний (Turbo) з типовою пам'яттю_сплит (64)

  2. Тести проводилися в моїй локальній мережі (802.11g Wifi).

  3. Я використовував стандартний приклад "Hello World" з веб-сайту 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. Параметри лавки Apache: ab -r -n 10000 -c 100 http://192.168.0.116:1337/

Таким чином, ці тести не є репрезентативними для звичайного веб-додатку (як щодо мережевого з'єднання, так і тривалості / складності переданого вмісту).

Результати

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)

Для порівняння я також встановив nginx на свій Raspberry Pi і провів той самий тест із замовчуванням "Ласкаво просимо до nginx!" 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)

Оптимізація параметрів Raspberry Pi

Використовуйте raspi-configдля зміни наступних налаштувань:

  1. Встановіть пам'ять_split для графічного процесора на 16 (найменше значення)
  2. Встановіть режим розгону на "Turbo" для найшвидших налаштувань оперативної пам'яті / процесора

9

Веб-сервери

Node.JS можна використовувати як заміну веб-сервера на Pi, і ви можете легко створювати окремі веб-програми або веб-додатки на одній сторінці.

Але тільки для вашої інформації в більшості реальних програм рекомендується використовувати такі сервери, як сучасний nginx, легкий lighttpdабо приємний, але повнофункціональний apache2! А потім скрипт node.js для доповнення сайту.

Очевидно, що можливості нескінченні, і все залежить від того, що ви хотіли б досягти.

Малина Пі?

Raspberry Pi може запускати будь-який із цих веб-серверів. Він також може запустити Node без будь-яких серйозних ускладнень і справді швидко, без складних налаштувань.

Raspberry Pi дуже здатний, але найкраще було б перетворити розділену пам'ять на мінімум графіки та більшості оперативної пам’яті. Забудьте про використання IDE і просто зробіть все через SSH. Якщо вам справді потрібен ще трохи соку, тоді поставте радіатор на мікросхему BCM і розігнайте його, коли ви відчуваєте себе в безпеці. Іншим варіантом було б використання декількох Pi в якості кластера, щоб допомогти з балансуванням навантаження. Ви можете почати копати тут про кластеризацію.

Але чи справді вам потрібно використовувати node.js?

Node.JSпризначений для використання при запуску (або передбаченні) отримання сотень і тисяч запитів, для яких потрібні невеликі шматки даних для зберігання в БД, кешування або зчитування з мінімальними накладними витратами на сервері. Таким чином, ви керуєте ним за допомогою JS на клієнті, але Node.JSнасправді керує C / C ++. Що ж станеться, якщо вам потрібен спеціальний модуль або певна зміна базового коду?

У додатку, який обслуговує веб-сторінки, node.js зазвичай не випереджає апаш, наприклад, за окремими запитами. Неблокуюча функція node.js чудова, якщо ви маєте тисячі запитів за секунду протягом більшої частини дня, саме тут апаш буде блокувати та виходити з ладу.

Справжній приклад світу

Ebay - під час аукціону, коли у вас відлік останніх 30 секунд. У вас може бути кілька людей, які енергійно оновлювали сторінку та збільшували ставки. Тут світиться node.js, тому що сьогодні вам більше НЕ потрібно оновлюватись. Це тому, що JS дуже часто (300мс ~ 600мс) від усіх клієнтів відмовляється від node.js і може забезпечити досвід "реального аукціону". Ebay не працює виключно з node.js, але на дуже складних серверах, збалансованих навантаженням.

Щоб скласти та встановити Node.js на Pi *:

Очевидно, що немає нічого поганого в тому, щоб використовувати node.js замість інших, і як краще вивчити вузол, якщо не на акуратному маленькому пристрої, як Pi. Таким чином, ви можете самостійно скласти код.

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

оновлення: пізніші версії вузла (поточна версія v0.8.18) можна побудувати без спеціальних кроків нижче

далі нам потрібно сказати компілятору використовувати armv6архітектуру для компіляції:

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

Потім прокоментуйте рядки, починаючи з позначки 157, щоб видалити частини vfp3 та симулятор. Оскільки це об’єкт, схожий на JSON, не забудьте видалити кому на CPPDEFINESлінії!

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

Тоді звичайне налаштування, виготовлення, здійснення процесу встановлення, NB мені довелося вручну вказати місце розташування OpenSSL libpath:

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

Це все, у вас зараз має бути встановлена ​​робоча Node.JS!

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

* Посилання та оригінальна стаття

Але як зазначено в інших відповідях, ви можете просто завантажити попередньо складений двійковий файл, який буде просто працювати.

Висновки

Гарний шматок Пі непоганий. На Pi-файлі ви можете працювати майже все, що завгодно, просто не сподівайтесь на продуктивність на рівні виробництва.


2
Ну ... ви маєте рацію в тому, що, швидше за все, хочете поєднати Node.js з додатковим веб-сервером "front-end", таким як Nginx. Але що ви маєте на увазі під "ви потребуєте розробника C / C ++"? Поки ви не хочете працювати в ядрі Node.js або писати модулі, залежні від платформи, вам взагалі не потрібен C / C ++. JavaScript достатній для звичайного розробника програми Node.js. Де я помилився?
Голо Роден

Я мав на увазі під собою те, що node.js написаний на C / C ++ - Коли я робив дослідження на node.js, я натрапив на багато сайтів, які продемонстрували, як розширити бібліотеку. Але для цього потрібні чисті знання на C / C ++ - Для більшості цілей вам не потрібно - Але якщо ви коли-небудь опиняєтеся в такій ситуації, то node.js - неправильне рішення. Як це було в моєму випадку.
Пьотр Кула

Моє запитання - Raspberry Pi-орієнтоване --- Наскільки Raspberry Pi орієнтований для обслуговування програм Node? Якщо це так, як я можу точно настроїти RPi для досягнення найкращих результатів? --- а не орієнтований на Вузол --- Наскільки хороший чи поганий Вузол? Але дякую за вашу думку; Я відредагую початкове запитання, щоб зробити його більш зрозумілим.
Маріус Бутук

Так, я відповів на питання 1- The Pi також може працювати з node.js плюс повний стек LAMP! Як його тонко налаштувати? Це відкрите для обговорення. Будь ласка, уточнюйте, які параметри ви хочете налагодити? Я також розширив те, що, на мою думку, може допомогти у виконанні.
Пьотр Кула

1
Я буду голосувати, якщо ви об'єднаєте свої дві відповіді в цю.
Jivings

1

Питання: Наскільки Raspberry Pi підходить для обслуговування програм Node?

Відповідь: Дуже добре підходить :) Немає сумнівів у цьому.

Q: Якщо це так, як можна тонко налаштувати Raspberry Pi для досягнення найкращих результатів?

A: Не треба! Зосередьтеся на написанні дуже добре розроблених програм на вузлах. Оптимізація сценарію ваших програм - це шлях.

Завжди використовуйте проксі-сервер, наприклад, nginex, лише з однієї причини: Node.JS ще в дитинстві (порівняно з Apache), тому ви можете припустити, що ще потрібно виявити проблеми безпеки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.