Настройка 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 :)
Петр Кула
1
Похоже, когда выбор был сделан, вы все еще редактировали; Выбор ответа может быть отредактирован так же, как и ответы, так что спасибо за указание на это. :)
Мариус Бутук

Ответы:

14

Получение Node.js на Raspberry Pi

Вы также можете:

  1. Скомпилируйте Node.js самостоятельно (как уже указывал ppumkin ) - занимает около 2 часов на Raspberry Pi.
  2. Или вы можете скачать двоичный файл 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 Bench: 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 и запустил тот же тест со значением по умолчанию "Welcome to 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. Установите memory_split для графического процессора на 16 (самое низкое значение)
  2. Установите режим разгона "Turbo" для самых быстрых настроек ОЗУ / ЦП
Фредерик
источник
9

Веб-серверы

Node.JS может использоваться в качестве замены веб-сервера на Pi, и вы можете легко создавать автономные или одностраничные веб-приложения.

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

Очевидно, что возможности безграничны, и все зависит от того, чего вы хотели бы достичь.

Raspberry Pi?

Raspberry Pi может работать на любом из этих веб-серверов. Он также может запускать Node без каких-либо серьезных осложнений и действительно быстр без каких-либо сложных настроек.

Raspberry Pi очень способный, но лучше всего было бы превратить разделение памяти в минимум графики и большей части оперативной памяти. Забудьте об использовании IDE и просто делайте все через SSH. Если вам действительно нужно еще сока, установите радиатор на чип BCM и разгоните его, чтобы чувствовать себя в безопасности. Другой вариант - использовать несколько Pi в качестве кластера, чтобы помочь с балансировкой нагрузки. Вы можете начать копаться здесь о кластеризации.

Но вам действительно нужно использовать node.js?

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

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

Пример из реального мира

Ebay - во время аукциона, когда у вас есть обратный отсчет за последние 30 секунд. У вас может быть несколько человек, которые активно обновляли страницу и увеличивали ставки. Именно здесь сияет node.js, потому что сегодня вам больше НЕ нужно обновляться. Это связано с тем, что JS очень часто направляет нод к node.js (300 мс ~ 600 мс) от всех клиентов и может предоставить опыт «реального аукциона». 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'],
  # }
 },

Затем обычная настройка, make, make install process, 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 с дополнительным интерфейсным веб-сервером, таким как 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 для достижения наилучших результатов? --- и не ориентированный на ноды --- Насколько хорош или плох Node? Но спасибо за ваше мнение; Я отредактирую первоначальный вопрос, чтобы сделать его более понятным.
Мариус Бутук
Да, я ответил на вопрос 1 - Pi может обрабатывать node.js плюс полный стек LAMP! Как это настроить? Это открыто для обсуждения. Пожалуйста, уточните, какие параметры вы хотите настроить? Я также рассказал о том, что, по моему мнению, может помочь с производительностью.
Петр Кула
1
Я буду голосовать, если вы объедините свои два ответа в этот.
Jivings
1

Q: Насколько Raspberry Pi подходит для приложений Node?

A: Очень хорошо подходит :) Без сомнения об этом.

Q: Если это так, как можно настроить Raspberry Pi для достижения наилучших результатов?

A: Не надо! Сосредоточьтесь на написании очень хорошо разработанных узловых приложений. Оптимизация сценариев ваших приложений - путь.

Всегда используйте прокси-сервер, например nginex, только по одной причине: Node.JS все еще находится в детстве (по сравнению с Apache), поэтому вы можете предположить, что проблемы безопасности еще предстоит обнаружить.

Terradon
источник