Configuración de Raspberry Pi para Node.js

15

Al leer un libro sobre aplicaciones web de una sola página , llegué a un párrafo que me hizo pensar:

Node.js no es bloqueante y está controlado por eventos. En pocas palabras, esto significa que una sola instancia de Node.js en hardware modesto puede manejar decenas o cientos de miles de conexiones abiertas concurrentes , como las que se usan en la mensajería en tiempo real, que a menudo es una característica muy deseada de los SPA modernos.

Noté el caso de usar Raspberry Pi como un servidor Rails , entonces, ¿qué tal para Node.js?

¿Cómo configuro mi Raspberry Pi para servir una aplicación Node.js?
¿Alguien lo intentó, hay consejos y trucos, quizás problemas o limitaciones a considerar?


Editar: para evitar malentendidos o fuera de tema, mantengamos el foco en Raspberry Pi, en el contexto de Node.js:

  1. ¿Qué tan adecuado es el Raspberry Pi para servir aplicaciones Node?
  2. Si ese es el caso, ¿cómo se puede ajustar la Raspberry Pi para obtener mejores resultados?
Marius Butuc
fuente
Debido a que el libro trata sobre la aplicación de una sola página, node.js tuvo que aparecer allí. Sí, es posible servir todo con el nodo. Pero dudo que alguna vez puede hacer en cualquier entorno de producción, ya que puede ser muy complejo y poco amigable
Piotr Kula
Es extraño cómo actualizó su respuesta para hacer 2 preguntas específicas para evitar confusiones y luego marcó una respuesta para instalar node.js, ¿cuál no era la pregunta? Su pregunta original fue, cómo configurarlo y cualquier consejo. ¿Por qué me molesté? LOL :)
Piotr Kula
1
Parece que cuando tomaste la decisión, todavía estabas editando; la elección de la respuesta se puede editar al igual que las respuestas, así que gracias por señalarlo. :)
Marius Butuc

Respuestas:

14

Conseguir Node.js en una Raspberry Pi

Tu también puedes:

  1. Compile Node.js usted mismo (como ya señaló ppumkin ): toma alrededor de 2 horas en una Raspberry Pi.
  2. O puede descargar el binario v0.8.17

Actuación

Hice una prueba de rendimiento rápida (para dar una primera impresión aproximada):

  1. Mi Raspberry Pi está overclockeado (Turbo) con la memoria predeterminada_split (64)

  2. Las pruebas se realizaron en mi red local (802.11g Wifi).

  3. Usé el ejemplo estándar "Hello World" del sitio 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. Configuración de Apache Bench: ab -r -n 10000 -c 100 http://192.168.0.116:1337/

Por lo tanto, estas pruebas no son representativas de una aplicación web normal (tanto en lo que respecta a la conexión de red como a la longitud / complejidad del contenido transferido).

Resultados

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)

Para comparar, también instalé nginx en mi Raspberry Pi y ejecuté la misma prueba con el predeterminado "¡Bienvenido a nginx!" Archivo 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)

Optimizar la configuración de Raspberry Pi

Use raspi-configpara cambiar las siguientes configuraciones:

  1. Establezca memory_split para la GPU en 16 (valor más bajo)
  2. Establezca el modo de overclocking en "Turbo" para obtener la configuración más rápida de RAM / CPU
Frederic
fuente
9

Servidores web

Node.JS puede usarse como reemplazo del servidor web en el Pi y puede crear aplicaciones web independientes o de una sola página con facilidad.

Pero solo para su información, en la mayoría de las aplicaciones del mundo real se recomienda utilizar servidores como el moderno nginx, ligero lighttpdo grueso pero con todas las funciones apache2. Y luego script node.js para complementar el sitio.

Obviamente, las posibilidades son infinitas y todo depende de lo que le gustaría lograr.

Raspberry Pi?

La Raspberry Pi puede ejecutar cualquiera de esos servidores web. También puede ejecutar Node sin complicaciones serias y es realmente rápido sin ningún ajuste complicado.

La Raspberry Pi es muy capaz, pero lo mejor sería convertir la división de memoria en la menor cantidad de gráficos y la mayor cantidad de RAM. Olvídate de usar un IDE y simplemente haz todo a través de SSH. Si realmente necesita más jugo, coloque un disipador de calor en el chip BCM y hágalo overclockear cuando se sienta seguro. Otra opción sería usar múltiples Pi como un clúster para ayudar con el equilibrio de carga. Puede comenzar a cavar por aquí acerca de la agrupación.

¿Pero realmente necesitas usar node.js?

Node.JSestaba destinado a usarse cuando comienza (o anticipa) para obtener cientos y miles de solicitudes que requieren que se almacenen pequeños fragmentos de datos en DB, almacenados en caché o leídos de nuevo con una sobrecarga mínima del servidor. Entonces lo maneja usando JS en el cliente, pero en Node.JSrealidad lo maneja C / C ++. Entonces, ¿qué sucede si necesita un módulo personalizado o un cambio específico en el código base?

En una aplicación que sirve páginas web, node.js generalmente no supera a Apache, por ejemplo, en solicitudes únicas. La función sin bloqueo de node.js es excelente si tiene miles de solicitudes por segundo durante la mayor parte del día, aquí es donde Apache se bloquearía y se bloquearía.

Un ejemplo del mundo real.

Ebay: durante una subasta cuando tienes una cuenta regresiva de los últimos 30 segundos. Puede tener varias personas que solían actualizar la página vigorosamente y aumentar las ofertas. Aquí es donde brilla node.js, porque hoy NO necesita actualizar más. Esto se debe a que JS conecta a node.js con mucha frecuencia (300 ms ~ 600 ms) de todos los clientes y puede proporcionar una experiencia de "subasta de la vida real". Ebay no se ejecuta únicamente en node.js sino en granjas de servidores equilibradas con carga muy compleja.

Para compilar e instalar Node.js en Pi *:

Obviamente, no hay nada de malo en usar node.js en lugar de otros y cuál es la mejor manera de aprender el nodo si no está en un pequeño dispositivo como Pi. Para que pueda compilar el código usted mismo así.

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

actualización: las versiones posteriores del nodo (la versión actual es v0.8.18) se pueden construir sin los pasos especiales a continuación

a continuación, debemos decirle al compilador que use la armv6arquitectura para la compilación:

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

Luego comente las líneas que comienzan alrededor de la marca 157, para eliminar el vfp3 y las partes del simulador. Como se trata de un objeto similar a JSON, recuerde eliminar la coma en la CPPDEFINESlínea.

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

Luego, el proceso habitual de configuración, creación y realización, NB tuve que especificar manualmente la ubicación de la ruta de acceso de OpenSSL:

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

Eso es todo, ¡ahora debería tener una instalación Node.JS funcionando!

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

* Referencias y articulo original

Pero como se señaló en otras respuestas, simplemente puede descargar un binario precompilado que simplemente funcionará.

Conclusiones

Un buen pedazo de Pi no está mal. Puede ejecutar casi cualquier cosa en el Pi- Simplemente no espere un rendimiento a nivel de producción.

Piotr Kula
fuente
2
Bueno ... tiene razón en que lo más probable es que desee combinar Node.js con un servidor web "front-end" adicional como Nginx. ¿Pero qué quieres decir con "NECESITAS un desarrollador C / C ++"? Mientras no desee trabajar en el núcleo de Node.js o escribir módulos dependientes de la plataforma, no necesita C / C ++ en absoluto. JavaScript es suficiente para el desarrollador de aplicaciones Node.js común. ¿Dónde te entendí mal?
Golo Roden el
Todo lo que quise decir con eso fue que node.js está escrito en C / C ++. Cuando estaba investigando en node.js, encontré muchos sitios que demostraban cómo expandirse en la biblioteca. Pero eso requería un conocimiento puro en C / C ++. Para la mayoría de los propósitos, no necesitará hacerlo. Pero si alguna vez aterriza en una situación como esa, node.js es la solución incorrecta. Como sucedió en mi caso.
Piotr Kula el
Mi pregunta está centrada en Raspberry Pi --- ¿Qué tan adecuado es Raspberry Pi para servir aplicaciones de Nodo? Si ese es el caso, ¿cómo puedo ajustar el RPi para obtener mejores resultados? --- y no centrado en el nodo --- ¿Qué tan bueno o malo es el nodo? Pero gracias por tu opinión; Editaré la pregunta inicial para que quede más clara.
Marius Butuc el
Sí, respondí la pregunta 1- ¡El Pi puede manejar node.js más una pila LAMP completa también! ¿Cómo afinarlo? Eso está abierto a discusión. Por favor, sea más específico ¿qué parámetros desea ajustar? También amplié lo que siento que puede ayudar con el rendimiento.
Piotr Kula el
1
Votaré si combinas tus dos respuestas en esta.
Jivings
1

P: ¿Qué tan adecuado es el Raspberry Pi para servir aplicaciones Node?

A: Muy adecuado :) No hay duda al respecto.

P: Si ese es el caso, ¿cómo se puede ajustar la Raspberry Pi para obtener mejores resultados?

A: no lo hagas! Concéntrese en escribir aplicaciones de nodo muy bien diseñadas. Optimizar el script de aplicaciones es el camino a seguir.

Siempre use un servidor proxy, por ejemplo nginex, solo por una razón: Node.JS todavía está en su infancia (en comparación con Apache), por lo que puede suponer que todavía hay problemas de seguridad por descubrir.

Terradon
fuente