Định cấu hình Raspberry Pi cho Node.js


15

Đọc một cuốn sách về các ứng dụng web đơn Tôi đã đến một đoạn khiến tôi suy nghĩ:

Node.js không chặn và hướng sự kiện. Tóm lại, điều này có nghĩa là một cá thể Node.js trên phần cứng khiêm tốn có thể xử lý hàng chục hoặc hàng trăm ngàn kết nối mở đồng thời , như các kết nối được sử dụng trong nhắn tin thời gian thực, thường là một tính năng rất được mong muốn của các SPA hiện đại.

Tôi nhận thấy các trường hợp sử dụng Raspberry Pi như một máy chủ Rails , vậy làm thế nào về cho Node.js?

Làm cách nào để thiết lập Raspberry Pi của tôi để phục vụ ứng dụng Node.js?
Có ai đã thử, có mẹo & thủ thuật, có thể là gotchas hoặc giới hạn để xem xét?


Chỉnh sửa: Để tránh hiểu lầm hoặc lạc đề, chúng ta hãy tập trung vào Raspberry Pi, trong bối cảnh Node.js:

  1. Raspberry Pi phù hợp như thế nào để phục vụ các ứng dụng Node?
  2. Nếu đó là trường hợp, làm thế nào một người có thể tinh chỉnh Raspberry Pi để có kết quả tốt nhất?

Vì cuốn sách là tất cả về ứng dụng Trang đơn, nên node.js phải xuất hiện ở đó. Có, nó có thể phục vụ mọi thứ với nút. Nhưng tôi nghi ngờ nó sẽ được thực hiện trong bất kỳ môi trường sản xuất nào vì nó có thể trở nên rất phức tạp và không thân thiện
Piotr Kula

Thật kỳ lạ khi bạn cập nhật câu trả lời của mình để hỏi 2 câu hỏi cụ thể để tránh nhầm lẫn và sau đó đánh dấu một câu trả lời để cài đặt node.js- đó không phải là câu hỏi? Câu hỏi ban đầu của bạn là, làm thế nào để thiết lập nó và bất kỳ lời khuyên nào. Tại sao tôi còn bận tâm. LOL :)
Piotr Kula

1
Hình như khi lựa chọn được đưa ra, bạn vẫn đang chỉnh sửa; Chọn câu trả lời có thể được chỉnh sửa giống như câu trả lời, vì vậy cảm ơn bạn đã chỉ ra điều đó. :)
Marius Butuc

Câu trả lời:


14

Bắt Node.js trên Raspberry Pi

Bạn có thể:

  1. Tự biên dịch Node.js (như ppumkin đã chỉ ra ) Thời gian thực hiện khoảng 2 giờ trên Raspberry Pi.
  2. Hoặc bạn có thể tải xuống bản nhị phân v0.8.17

Hiệu suất

Tôi đã làm một bài kiểm tra hiệu suất nhanh (để tạo ấn tượng ban đầu):

  1. Raspberry Pi của tôi được ép xung (Turbo) với bộ nhớ mặc định_split (64)

  2. Các thử nghiệm đã được thực hiện qua mạng cục bộ của tôi (802.11g Wifi).

  3. Tôi đã sử dụng ví dụ "Hello World" tiêu chuẩn từ trang 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. Cài đặt băng ghế dự bị Apache: ab -r -n 10000 -c 100 http://192.168.0.116:1337/

Vì vậy, các thử nghiệm này không đại diện cho một ứng dụng web thông thường (cả liên quan đến kết nối mạng và độ dài / độ phức tạp của nội dung được truyền).

Các kết quả

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)

Để so sánh, tôi cũng đã cài đặt nginx trên Raspberry Pi của mình và chạy thử nghiệm tương tự với mặc định "Chào mừng bạn đến nginx!" Tệp 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)

Tối ưu hóa cài đặt Raspberry Pi

Sử dụng raspi-configđể thay đổi các cài đặt sau:

  1. Đặt memory_split cho GPU thành 16 (giá trị thấp nhất)
  2. Đặt chế độ ép xung thành "Turbo" để cài đặt RAM / CPU nhanh nhất

9

Máy chủ web

Node.JS có thể được sử dụng như một sự thay thế máy chủ web trên Pi và bạn có thể tạo các ứng dụng web độc lập hoặc một trang một cách dễ dàng.

Nhưng chỉ với thông tin của bạn, trong hầu hết các ứng dụng trong thế giới thực, nên sử dụng các máy chủ như hiện đại nginx, trọng lượng nhẹ lighttpdhoặc chunky nhưng đầy đủ tính năng apache2! Và sau đó tập lệnh node.js để bổ sung cho trang web.

Rõ ràng khả năng là vô tận và mọi thứ phụ thuộc vào những gì bạn muốn đạt được.

Quả mâm xôi Pi?

Raspberry Pi có thể chạy bất kỳ máy chủ web nào. Nó cũng có thể chạy Node mà không có bất kỳ biến chứng nghiêm trọng nào và thực sự nhanh mà không cần chỉnh sửa phức tạp.

Raspberry Pi rất có khả năng nhưng tốt nhất sẽ là phân chia bộ nhớ thành đồ họa ít nhất và hầu hết RAM. Hãy quên việc sử dụng IDE và chỉ cần làm mọi thứ thông qua SSH. Nếu bạn thực sự cần thêm một ít nước trái cây thì hãy đặt một bộ tản nhiệt trên chip BCM và ép xung nó khi bạn cảm thấy an toàn. Một tùy chọn khác là sử dụng nhiều Pi như một cụm để giúp cân bằng tải. Bạn có thể bắt đầu đào xung quanh đây về phân cụm.

Nhưng bạn có thực sự cần sử dụng node.js không?

Node.JSđược dự định sẽ được sử dụng khi bạn bắt đầu (hoặc dự đoán) để nhận được hàng trăm và hàng nghìn yêu cầu yêu cầu khối dữ liệu nhỏ được lưu trữ vào DB, được lưu trong bộ nhớ cache hoặc đọc lại với chi phí máy chủ tối thiểu. Vì vậy, bạn lái nó bằng cách sử dụng JS trên máy khách nhưng Node.JSthực sự được điều khiển bởi C / C ++. Vậy điều gì xảy ra nếu bạn cần mô-đun tùy chỉnh hoặc thay đổi cụ thể trong mã cơ sở?

Trong một ứng dụng phục vụ các trang web node.js thường không vượt trội hơn apache, ví dụ, trên các yêu cầu duy nhất. Tính năng không chặn của node.js là tuyệt vời nếu bạn có hàng ngàn yêu cầu mỗi giây trong hầu hết thời gian trong ngày, đây là lúc apache sẽ chặn và sụp đổ.

Một ví dụ thực tế

Ebay - Trong một cuộc đấu giá khi bạn đếm ngược trong 30 giây qua. Bạn có thể có một vài người được sử dụng để làm mới trang mạnh mẽ và tăng giá thầu. Đây là nơi node.js tỏa sáng, vì hôm nay bạn không cần làm mới nữa. Đó là bởi vì JS thường xuyên chuyển sang node.js (300ms ~ 600ms) từ tất cả các máy khách và có thể cung cấp trải nghiệm "đấu giá ngoài đời thực". Ebay không chỉ chạy trên node.js mà trên các trang trại máy chủ cân bằng tải rất phức tạp.

Để xây dựng và cài đặt Node.js trên Pi *:

Rõ ràng không có gì sai khi sử dụng node.js thay vì người khác và cách tốt nhất để tìm hiểu nút nếu không phải trên một thiết bị nhỏ gọn như Pi. Vì vậy, bạn có thể tự biên dịch mã như thế này.

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

cập nhật: các phiên bản mới hơn của nút (phiên bản hiện tại là v0.8.18) có thể được xây dựng mà không cần các bước đặc biệt dưới đây

tiếp theo chúng ta cần báo cho trình biên dịch sử dụng armv6kiến trúc để biên dịch:

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

Sau đó nhận xét các dòng bắt đầu xung quanh dấu 157, để xóa vfp3 và các phần giả lập. Vì đây là một đối tượng giống như JSON, hãy nhớ xóa dấu phẩy trên CPPDEFINESdòng!

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

Sau đó, cấu hình thông thường, tạo, thực hiện quá trình cài đặt, NB Tôi phải chỉ định thủ công vị trí của libpath OpenSSL:

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

Đó là, bây giờ bạn sẽ có một cài đặt Node.JS hoạt động!

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

* Tài liệu tham khảo và bài viết gốc

Nhưng như đã chỉ ra trong các câu trả lời khác, bạn có thể chỉ cần tải xuống tệp nhị phân được biên dịch sẵn sẽ hoạt động.

Kết luận

Một mảnh tốt của Pi không phải là xấu. Bạn có thể chạy bất cứ thứ gì trên Pi- Chỉ không mong đợi hiệu suất ở mức sản xuất.


2
Chà ... bạn nói đúng rằng bạn rất có thể muốn kết hợp Node.js với một máy chủ web "front-end" bổ sung như Nginx. Nhưng ý bạn là gì khi "bạn CẦN một nhà phát triển C / C ++"? Miễn là bạn không muốn làm việc trên lõi Node.js hoặc viết các mô đun phụ thuộc vào nền tảng, bạn hoàn toàn không cần C / C ++. JavaScript là đủ cho nhà phát triển ứng dụng Node.js phổ biến. Tôi đã sai bạn ở đâu?
Golo Roden

Tất cả những gì tôi muốn nói là đó là node.js được viết bằng C / C ++ - Khi tôi đang nghiên cứu về node.js, tôi đã xem qua nhiều trang web trình bày cách mở rộng trên thư viện. Nhưng điều đó đòi hỏi kiến ​​thức thuần túy trong C / C ++ - Đối với hầu hết các mục đích bạn sẽ không cần - Nhưng nếu bạn gặp phải tình huống như vậy thì node.js là giải pháp sai. Như nó đã xảy ra trong trường hợp của tôi.
Piotr Kula

Câu hỏi của tôi là Raspberry Pi tập trung --- Raspberry Pi phù hợp như thế nào để phục vụ các ứng dụng Node? Nếu đó là trường hợp, làm thế nào tôi có thể tinh chỉnh RPi để có kết quả tốt nhất? --- và không tập trung vào Node --- Node tốt hay xấu như thế nào? Nhưng cảm ơn ý kiến ​​của bạn; Tôi sẽ chỉnh sửa câu hỏi ban đầu để làm cho nó rõ ràng hơn.
Marius Butuc

Phải, tôi đã trả lời câu hỏi 1- Pi có thể xử lý node.js cộng với một ngăn xếp LAMP đầy đủ! Làm thế nào để tinh chỉnh nó? Đó là mở để thảo luận. Xin hãy cụ thể hơn những thông số bạn muốn tinh chỉnh? Tôi cũng mở rộng về những gì tôi cảm thấy có thể giúp với hiệu suất.
Piotr Kula

1
Tôi sẽ upvote nếu bạn hợp nhất hai câu trả lời của bạn vào câu trả lời này.
Jivings

1

Q: Raspberry Pi phù hợp như thế nào để phục vụ các ứng dụng Node?

A: Rất phù hợp :) Không nghi ngờ gì về điều đó.

Q: Nếu đó là trường hợp, làm thế nào một người có thể tinh chỉnh Raspberry Pi để có kết quả tốt nhất?

A: Đừng! Tập trung vào viết các ứng dụng nút được thiết kế rất tốt. Tối ưu hóa tập lệnh ứng dụng của bạn là cách để đi.

Luôn sử dụng proxyserver, ví dụ nginex, chỉ vì một lý do: Node.JS vẫn còn trong những năm thơ ấu của cô ấy (so với Apache), vì vậy bạn có thể cho rằng vẫn còn những vấn đề an toàn cần khám phá.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.