Node.js를위한 Raspberry Pi 구성


15

단일 페이지 웹 응용 프로그램 에서 책을 읽었을 때 제가 생각하게하는 단락에 도달했습니다.

Node.js는 비 차단 및 이벤트 중심입니다. 요컨대, 보통 하드웨어 의 단일 Node.js 인스턴스 는 실시간 메시징에 사용되는 것과 같은 수만 또는 수십만 개의 동시 개방 연결을 처리 할 수 있으며 이는 종종 최신 SPA의 매우 바람직한 기능입니다.

Raspberry Pi를 Rails 서버로 사용 하는 경우를 알았 으므로 Node.js는 어떻습니까?

Node.js 애플리케이션을 제공하도록 Raspberry Pi를 어떻게 설정합니까?
누구든지 시도해 보았고, 팁과 트릭이 있습니까, 아마도 고려해야 할 것이 있습니까?


편집 : 오해 또는 주제를 피하기 위해 Node.js 컨텍스트에서 Raspberry Pi에 계속 집중하십시오.

  1. Raspberry Pi는 노드 애플리케이션에 적합합니까?
  2. 이 경우 어떻게 최상의 결과를 얻기 위해 Raspberry Pi를 미세 조정할 수 있습니까?

이 책은 모두 단일 페이지 응용 프로그램에 관한 것이기 때문에 node.js가 등장했습니다. 예, 노드로 모든 것을 제공 할 수 있습니다. 그러나 나는 그것이 매우 복잡하고 비우호적 일 수 있기 때문에 어떤 생산 환경에서도 이루어지지 않을 것이라고 의심한다
Piotr Kula

혼동을 피하기 위해 두 가지 특정 질문을하도록 답변을 업데이트 한 다음 질문이 아닌 node.js 설치에 대한 답변을 표시하는 것이 이상합니다. 원래 질문은 설정 방법과 조언이었습니다. 내가 왜 귀찮게 했어? LOL :)
Piotr Kula

1
아직 편집을 선택했을 때의 모습입니다. 답변 선택은 답변과 마찬가지로 편집 할 수 있으므로이 점을 지적 해 주셔서 감사합니다. :)
Marius Butuc

답변:


14

라즈베리 파이에서 Node.js 얻기

다음 중 하나를 수행 할 수 있습니다.

  1. 컴파일 Node.js를 스스로 (로 이미 지적 ppumkin ) 라스베리 파이에 2시간에 대해 -takes.
  2. 또는 바이너리 v0.8.17을 다운로드 할 수 있습니다

공연

나는 빠른 성능 테스트를 거쳤습니다 (거의 첫인상을주기 위해).

  1. 내 Raspberry Pi가 기본 memory_split (64)으로 오버 클럭킹 (터보)

  2. 테스트는 로컬 네트워크 (802.11g Wifi)를 통해 수행되었습니다.

  3. Node.js 웹 사이트에서 표준 "Hello World"예제를 사용했습니다.

    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. 아파치 벤치 설정 : 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)

비교를 위해 Raspberry Pi에도 nginx를 설치하고 기본 "Nelgin to 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)

라즈베리 파이 설정 최적화

raspi-config다음 설정을 변경하는 데 사용하십시오 .

  1. GPU의 memory_split을 16 (최저값)으로 설정하십시오.
  2. 가장 빠른 RAM / CPU 설정을 위해 오버 클럭킹 모드를 "터보"로 설정

9

웹 서버

Node.JS Pi에서 웹 서버 교체로 사용할 수 있으며 독립형 또는 단일 페이지 웹 응용 프로그램을 쉽게 만들 수 있습니다.

그러나 대부분의 실제 응용 프로그램에서는 정보를 위해 현대식 nginx, 경량 lighttpd또는 뭉툭하지만 완전한 기능을 갖춘 서버를 사용하는 것이 좋습니다 apache2! 그런 다음 사이트를 보완하기 위해 node.js 스크립트를 작성하십시오.

분명히 가능성은 무한하며 모든 것이 달성하고자하는 것에 달려 있습니다.

라즈베리 파이?

Raspberry Pi는 모든 웹 서버를 실행할 수 있습니다. 또한 심각한 합병증없이 노드를 실행할 수 있으며 복잡한 조정없이 실제로 빠릅니다.

Raspberry Pi는 성능이 뛰어나지 만 메모리 분할 을 최소 그래픽 및 대부분의 RAM 으로 전환하는 것이 가장 좋습니다 . IDE 사용을 잊고 SSH를 통해 모든 것을 수행하십시오. 주스가 더 필요한 경우 BCM 칩에 방열판을 놓고 안전하다고 느낄 때 오버 클로킹 하십시오. 다른 옵션은로드 밸런싱을 돕기 위해 여러 Pi를 클러스터로 사용하는 것입니다. 클러스터링에 대해 여기에서 파기를 시작할 수 있습니다.

그러나 정말로 node.js를 사용해야합니까?

Node.JS최소한의 서버 오버 헤드로 작은 덩어리의 데이터를 DB에 저장하거나 캐시하거나 다시 읽어야하는 수백 수천 개의 요청을 받기 위해 시작 (또는 예상) 할 때 사용되었습니다. 따라서 클라이언트에서 JS를 사용하여 Node.JS구동 하지만 실제로는 C / C ++에 의해 구동됩니다. 사용자 정의 모듈이나 기본 코드의 특정 변경이 필요한 경우 어떻게됩니까?

웹 페이지를 제공하는 응용 프로그램에서 node.js는 일반적으로 단일 요청에서 아파치를 능가하지 않습니다. node.js의 비 차단 기능은 하루 종일 초당 수천 건의 요청이있는 경우 유용합니다. 이곳에서 아파치가 차단되고 충돌합니다.

실제 예

이베이-지난 30 초의 카운트 다운이있는 경매 중. 페이지를 활발하게 새로 고침하고 입찰가를 높이는 데 사용했던 사람이 여러 명있을 수 있습니다. 오늘은 더 이상 새로 고칠 필요가 없기 때문에 node.js가 빛나는 곳입니다. JS는 모든 클라이언트에서 node.js로 아주 자주 (300ms ~ 600ms) 아약스를 제공하고 "실제 경매"경험을 제공 할 수 있기 때문입니다. Ebay는 node.js에서만 실행되는 것이 아니라 매우 복잡한로드 밸런스 서버 팜에서 실행됩니다.

Pi *에서 Node.js를 빌드하고 설치하려면 :

분명히 다른 노드 대신 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의 좋은 조각은 나쁘지 않습니다. Pi-just에서 거의 모든 것을 실행할 수 있습니다. 프로덕션 수준의 성능을 기대하지 마십시오.


2
글쎄 ... Node.js를 Nginx와 같은 추가 "프론트 엔드"웹 서버와 결합하고 싶을 것입니다. 그러나 "C / C ++ 개발자가 필요하다"는 것은 무엇을 의미합니까? Node.js 코어에서 작업하거나 플랫폼 종속 모듈을 작성하지 않으려는 경우 C / C ++이 전혀 필요하지 않습니다. JavaScript는 일반적인 Node.js 앱 개발자에게 충분합니다. 내가 어디 틀렸어?
Golo Roden

이것이 의미하는 것은 node.js가 C / C ++로 작성되었다는 것입니다. node.js에 대한 연구를 수행 할 때 라이브러리에서 확장하는 방법을 보여주는 많은 사이트를 발견했습니다. 그러나 C / C ++에 대한 순수한 지식이 필요했습니다. 대부분의 경우 필요하지 않습니다. 그러나 그런 상황에 처하게되면 node.js가 잘못된 솔루션입니다. 내 경우에 일어난 것처럼.
Piotr Kula

내 질문 은 Raspberry Pi 중심입니다 --- Raspberry Pi는 노드 응용 프로그램에 얼마나 적합합니까? 이 경우 최상의 결과를 얻으려면 어떻게 RPi를 미세 조정할 수 있습니까? --- 그리고 노드 중심이 아닌 --- 노드 는 얼마나 좋습니까? 그러나 귀하의 의견에 감사드립니다. 더 명확하게하기 위해 초기 질문을 편집하겠습니다.
Marius Butuc

그래도 질문 1에 대답했습니다. Pi는 node.js와 전체 ​​램프 스택을 처리 할 수 ​​있습니다! 미세 조정하는 방법? 그것은 토론에 열려 있습니다. 미세 조정하려는 파라미터를 더 구체적으로 지정하십시오. 또한 성능에 도움이 될 수있는 것으로 확장했습니다.
Piotr Kula

1
두 대답을이 질문에 병합하면 투표 할 것입니다.
Jivings

1

Q : Raspberry Pi는 노드 애플리케이션에 적합합니까?

A : 매우 적합합니다.) 의심 할 여지가 없습니다.

Q : 그렇다면, 어떻게 최상의 결과를 얻기 위해 Raspberry Pi를 미세 조정할 수 있습니까?

A : 하지마! 잘 설계된 노드 응용 프로그램 작성에 중점을 둡니다. 응용 프로그램 스크립트를 최적화하는 것이 좋습니다.

Node.JS는 아직 어린 시절에 (아파치와 비교할 때) 아직 프록시 서버를 사용하므로 nginex와 같은 프록시 서버를 사용하십시오. 따라서 여전히 발견해야 할 안전 문제가 있다고 가정 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.