Configurando o Raspberry Pi para Node.js

15

Lendo um livro sobre Aplicativos Web de Página Única, cheguei a um parágrafo que me fez pensar:

O Node.js é não-bloqueador e controlado por eventos. Em poucas palavras, isso significa que uma única instância do Node.js. em hardware modesto pode lidar com dezenas ou centenas de milhares de conexões abertas simultâneas , como as usadas nas mensagens em tempo real, que geralmente é um recurso altamente desejado dos SPAs modernos.

Percebi o caso de usar o Raspberry Pi como servidor Rails , e o Node.js.?

Como configuro meu Raspberry Pi para atender a um aplicativo Node.js.
Alguém tentou, existem dicas e truques, talvez truques ou limitações a considerar?


Edit: Para evitar mal-entendidos ou off-topic, vamos manter o foco no Raspberry Pi, no contexto do Node.js.

  1. Qual é a adequação do Raspberry Pi para atender aos aplicativos Node?
  2. Se for esse o caso, como ajustar o Raspberry Pi para obter melhores resultados?
Marius Butuc
fonte
Como o livro trata do aplicativo de página única, o node.js precisou aparecer lá. Sim, é possível servir tudo com o nó. Mas eu duvido que nunca vai ser feito em qualquer ambiente de produção, pois ele pode ser muito complexo e hostil
Piotr Kula
É estranho como você atualizou sua resposta para fazer duas perguntas específicas para evitar confusões e marcar uma resposta para instalar o node.js - que não era a pergunta? Sua pergunta original era: como configurá-lo e qualquer conselho. Por que eu me incomodei? LOL :)
Piotr Kula
11
Parece que quando a escolha foi feita, você ainda estava editando; a escolha da resposta pode ser editada da mesma forma que as respostas, por isso, obrigado por apontar isso. :)
Marius Butuc

Respostas:

14

Obtendo o Node.js em um Raspberry Pi

Você também pode:

  1. Compile o Node.js você mesmo (como o ppumkin já apontou ) - leva cerca de 2 horas em um Raspberry Pi.
  2. Ou você pode baixar o v0.8.17 binário

atuação

Fiz um teste rápido de desempenho (para dar uma primeira impressão aproximada):

  1. Meu Raspberry Pi está com overclock (Turbo) com memory_split padrão (64)

  2. Os testes foram realizados na minha rede local (802.11g Wifi).

  3. Usei o exemplo padrão "Hello World" no site do 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. Configurações do banco Apache: ab -r -n 10000 -c 100 http://192.168.0.116:1337/

Portanto, esses testes não são representativos para um aplicativo Web normal (tanto em relação à conexão de rede quanto à duração / complexidade do conteúdo 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 uma comparação, eu também instalei o nginx no meu Raspberry Pi e executei o mesmo teste com o padrão "Bem-vindo ao nginx!" Arquivo 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)

Otimizando as configurações do Raspberry Pi

Use raspi-configpara alterar as seguintes configurações:

  1. Defina o memory_split da GPU para 16 (valor mais baixo)
  2. Defina o modo de overclock para "Turbo" para obter as configurações mais rápidas de RAM / CPU
Frederic
fonte
9

Servidores da Web

Node.JS pode ser usado como um servidor de substituição no Pi e você pode criar aplicativos da Web independentes ou de página única com facilidade.

Mas apenas para sua informação, na maioria dos aplicativos do mundo real, é recomendável usar servidores como o moderno nginx, leve lighttpdou o robusto, mas com todos os recursos apache2! E, em seguida, faça o script node.js para complementar o site.

Obviamente, as possibilidades são infinitas e tudo depende do que você deseja alcançar.

Raspberry Pi?

O Raspberry Pi pode executar qualquer um desses servidores da web. Ele também pode executar o Node sem complicações sérias e é muito rápido sem nenhum ajuste complicado.

O Raspberry Pi é muito capaz, mas o melhor seria transformar a divisão da memória em menos gráficos e mais RAM. Esqueça o uso de um IDE e faça tudo via SSH. Se você realmente precisar de mais suco, coloque um dissipador de calor no chip BCM e faça o overclock quando se sentir seguro. Outra opção seria usar vários Pi's como um cluster para ajudar no balanceamento de carga. Você pode começar a pesquisar por aqui sobre cluster.

Mas você realmente precisa usar o node.js?

Node.JSfoi projetado para ser usado quando você inicia (ou antecipa) a obtenção de centenas e milhares de solicitações que exigem que pequenos pedaços de dados sejam armazenados no banco de dados, armazenados em cache ou lidos com sobrecarga mínima do servidor. Então, você o dirige usando JS no cliente, mas Node.JSna verdade é conduzido por C / C ++. Então, o que acontece se você precisar de um módulo personalizado ou de uma alteração específica no código base?

Em um aplicativo que exibe páginas da web, o node.js geralmente não supera o apache, por exemplo, em solicitações únicas. O recurso sem bloqueio do node.js é ótimo se você tiver milhares de solicitações por segundo durante a maior parte do dia; é aqui que o apache bloqueará e trava.

Um exemplo do mundo real

Ebay - Durante um leilão, quando você tem uma contagem regressiva dos últimos 30 segundos. Você pode ter várias pessoas que costumavam atualizar a página vigorosamente e aumentar os lances. É aqui que o node.js brilha, porque hoje você NÃO precisa mais atualizar. Isso ocorre porque o JS ajaxes para node.js com muita frequência (300ms ~ 600ms) de todos os clientes e é capaz de fornecer uma experiência de "leilão na vida real". O Ebay não roda apenas fora do node.js, mas em farms de servidores com balanceamento de carga muito complexos.

Para criar e instalar o Node.js no Pi *:

Obviamente, não há nada errado em usar o node.js em vez de outros e qual a melhor forma de aprender o nó, se não em um pequeno dispositivo como o Pi. Então você pode compilar o código você mesmo assim.

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

update: versões posteriores do nó (a versão atual é v0.8.18) podem ser construídas sem as etapas especiais abaixo

Em seguida, precisamos dizer ao compilador para usar a armv6arquitetura para a compilação:

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

Em seguida, comente as linhas começando na marca 157, para remover as partes vfp3 e simulador. Como este é um JSON-como objeto, lembre-se de remover a vírgula na CPPDEFINESlinha!

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

Em seguida, o processo habitual de configuração, fabricação, instalação, NB, eu tive que especificar manualmente o local do libpath do OpenSSL:

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

É isso, agora você deve ter uma instalação do Node.JS funcionando!

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

* Referências e artigo original

Mas, como indicado em outras respostas, você pode simplesmente baixar o binário pré-compilado que funcionará.

Conclusões

Um bom pedaço de Pi não é ruim. Você pode executar praticamente qualquer coisa no Pi- Só não espere um desempenho no nível de produção.

Piotr Kula
fonte
2
Bem ... você está certo no sentido de que provavelmente deseja combinar o Node.js com um servidor Web "front-end" adicional, como o Nginx. Mas o que você quer dizer com "você precisa de um desenvolvedor de C / C ++"? Contanto que você não queira trabalhar no núcleo do Node.js. ou gravar módulos dependentes da plataforma, não precisará do C / C ++. JavaScript é suficiente para o desenvolvedor comum do aplicativo Node.js. Onde eu te entendi errado?
precisa saber é o seguinte
Tudo o que eu quis dizer com isso foi que o node.js é escrito em C / C ++ - Quando eu estava pesquisando no node.js, encontrei muitos sites que demonstravam como expandir a biblioteca. Mas isso exigia conhecimento puro em C / C ++ - Para a maioria dos propósitos, você não precisará - Mas se você surgir em uma situação como essa, o node.js é a solução errada. Como aconteceu no meu caso.
Piotr Kula
Minha pergunta é focada no Raspberry Pi --- Qual a adequação do Raspberry Pi para atender aos aplicativos do Node? Se for esse o caso, como posso ajustar o RPi para obter melhores resultados? --- e não focado no nó --- Quão bom ou ruim é o nó? Mas obrigado pela sua opinião; Vou editar a pergunta inicial para torná-la mais clara.
Marius Butuc
Sim, eu respondi à pergunta 1 - O Pi também suporta o node.js, além de uma pilha LAMP completa! Como ajustá-lo? Isso está aberto à discussão. Por favor, seja mais específico quais parâmetros você deseja ajustar? Também expandi o que acho que pode ajudar no desempenho.
Piotr Kula
11
Vou votar se você mesclar suas duas respostas nesta.
Jivings
1

P: Qual é a adequação do Raspberry Pi para atender aos aplicativos Node?

A: Muito bem adaptado :) Sem dúvida.

P: Se for esse o caso, como ajustar o Raspberry Pi para obter melhores resultados?

A: Não! Concentre-se em escrever aplicativos de nó muito bem projetados. Otimizar o script de aplicativos é o caminho a percorrer.

Sempre use um servidor proxy, por exemplo, nginex, apenas por um motivo: o Node.JS ainda está na infância (comparado ao Apache), para que você possa assumir que ainda há problemas de segurança a serem descobertos.

Terradon
fonte