การกำหนดค่า Raspberry Pi สำหรับ Node.js


15

การอ่านหนังสือบนแอปพลิเคชันเว็บหน้าเดียวฉันมาถึงย่อหน้าที่ทำให้ฉันนึกถึง:

Node.js ไม่มีการบล็อคและเป็นตัวขับเคลื่อนเหตุการณ์ โดยสรุปแล้วสิ่งนี้หมายถึงอินสแตนซ์ Node.js เดียวบนฮาร์ดแวร์ที่เรียบง่ายสามารถจัดการการเชื่อมต่อแบบเปิดพร้อมกันหลายหมื่นหรือหลายแสนการเชื่อมต่อเช่นที่ใช้ในการส่งข้อความแบบเรียลไทม์ซึ่งมักเป็นคุณสมบัติที่ต้องการของสปาทันสมัย

ฉันสังเกตเห็นกรณีของการใช้ Raspberry Pi เป็นเซิร์ฟเวอร์ Railsแล้ว Node.js ล่ะ?

ฉันจะตั้งค่า Raspberry Pi ของฉันเพื่อแสดงแอปพลิเคชัน Node.js ได้อย่างไร
ไม่มีใครลองมีเคล็ดลับ & เทคนิคอาจ gotchas หรือข้อ จำกัด ในการพิจารณาหรือไม่?


แก้ไข:เพื่อหลีกเลี่ยงความเข้าใจผิดหรือปิดหัวข้อขอให้คุณให้ความสำคัญกับ Raspberry Pi ในบริบท Node.js:

  1. Raspberry Pi เหมาะสมกับการให้บริการแอปพลิเคชั่นโหนดหรือไม่
  2. หากเป็นเช่นนั้นเราจะปรับ Raspberry Pi ให้เป็นผลลัพธ์ที่ดีที่สุดได้อย่างไร

เนื่องจากหนังสือเล่มนี้เกี่ยวกับแอปพลิเคชันหน้าเดียว node.js จึงต้องปรากฏตัวที่นั่น ใช่เป็นไปได้ที่จะให้บริการทุกอย่างขึ้นกับโหนด แต่ฉันสงสัยว่ามันจะถูกสร้างขึ้นในสภาพแวดล้อมการผลิตใด ๆ เพราะมันซับซ้อนและไม่เป็นมิตร
Piotr Kula

เป็นเรื่องแปลกที่คุณอัปเดตคำตอบของคุณเพื่อถาม 2 คำถามเพื่อหลีกเลี่ยงความสับสนแล้วทำเครื่องหมายคำตอบสำหรับการติดตั้ง node.js ซึ่งไม่ใช่คำถาม คำถามเดิมของคุณคือวิธีการตั้งค่าและคำแนะนำใด ๆ ทำไมฉันถึงต้องรำคาญ LOL :)
Piotr Kula

1
ดูเหมือนว่าเมื่อตัวเลือกถูกทำให้คุณยังคงแก้ไขอยู่ การเลือกคำตอบสามารถแก้ไขได้เช่นเดียวกับคำตอบดังนั้นขอขอบคุณที่ชี้ให้เห็น :)
Marius Butuc

คำตอบ:


14

รับ Node.js ใน Raspberry Pi

คุณสามารถ:

  1. รวบรวม Node.js ด้วยตัวคุณเอง(ดังที่ppumkin ชี้ไปแล้ว ) - ใช้เวลาประมาณ 2 ชั่วโมงใน Raspberry Pi
  2. หรือคุณสามารถดาวน์โหลดไบนารี่ v0.8.17

ประสิทธิภาพ

ฉันทำการทดสอบประสิทธิภาพอย่างรวดเร็ว (เพื่อสร้างความประทับใจอย่างคร่าวๆ):

  1. Raspberry Pi ของฉันโอเวอร์คล็อก (Turbo) พร้อม memory_split เริ่มต้น (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 ของฉันและรันการทดสอบเดียวกันด้วยค่าเริ่มต้น "ยินดีต้อนรับสู่ 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 สำหรับ GPU เป็น 16 (ค่าต่ำสุด)
  2. ตั้งค่าโหมดโอเวอร์คล็อกเป็น "Turbo" เพื่อการตั้งค่า RAM / CPU ที่เร็วที่สุด

9

เว็บเซิร์ฟเวอร์

Node.JS สามารถใช้แทนเว็บเซิร์ฟเวอร์ใน Pi และคุณสามารถสร้างแอปพลิเคชันแบบสแตนด์อโลนหรือหน้าเว็บเดียวได้อย่างง่ายดาย

แต่สำหรับข้อมูลของคุณในแอปพลิเคชั่นส่วนใหญ่ในโลกแห่งความเป็นจริงขอแนะนำให้ใช้เซิร์ฟเวอร์เช่นความทันสมัยnginxน้ำหนักเบาlighttpdหรือความหนาแต่เต็มไปด้วยคุณสมบัติapache2! และจากนั้นสคริปต์ node.js เพื่อเสริมเว็บไซต์

เห็นได้ชัดว่าความเป็นไปได้ไม่มีที่สิ้นสุดและทุกอย่างขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุ

ราสเบอร์รี่ Pi?

Raspberry Pi สามารถเรียกใช้เว็บเซิร์ฟเวอร์เหล่านั้นได้ นอกจากนี้ยังสามารถเรียกใช้ Node ได้โดยไม่ต้องมีปัญหาแทรกซ้อนใด ๆ และรวดเร็วมากโดยไม่ต้องมีการปรับแต่งที่ซับซ้อน

Raspberry Pi นั้นมีความสามารถสูง แต่ที่ดีที่สุดคือการเปลี่ยนหน่วยความจำให้เหลือน้อยที่สุดกราฟิกและ RAM ส่วนใหญ่ ลืมการใช้ IDE และทำทุกอย่างผ่าน SSH หากคุณต้องการน้ำผลไม้เพิ่มขึ้นจริงๆให้วางแผ่นระบายความร้อนบนชิป BCM และโอเวอร์คล็อกในขณะที่คุณรู้สึกปลอดภัย ตัวเลือกอื่นจะใช้หลาย Pi เป็นคลัสเตอร์เพื่อช่วยในการสมดุลภาระ คุณสามารถเริ่มขุดแถวนี้เกี่ยวกับการรวมกลุ่ม

แต่คุณจำเป็นต้องใช้ node.js จริง ๆ หรือไม่

Node.JSมีวัตถุประสงค์เพื่อใช้เมื่อคุณเริ่ม (หรือคาดการณ์ไว้) เพื่อรับคำขอนับแสนที่ต้องใช้ข้อมูลขนาดเล็กเพื่อจัดเก็บในฐานข้อมูลแคชหรืออ่านกลับด้วยค่าใช้จ่ายของเซิร์ฟเวอร์น้อยที่สุด ดังนั้นคุณขับมันโดยใช้ JS บนไคลเอนต์ แต่Node.JSถูกขับเคลื่อนด้วย C / C ++ ดังนั้นจะเกิดอะไรขึ้นหากคุณต้องการโมดูลที่กำหนดเองหรือการเปลี่ยนแปลงเฉพาะในรหัสฐาน?

ในแอปพลิเคชันที่ให้บริการหน้าเว็บ node.js มักจะไม่ได้มีประสิทธิภาพดีกว่า apache ตัวอย่างเช่นในคำขอเดียว คุณลักษณะการไม่บล็อกของ node.js นั้นยอดเยี่ยมถ้าคุณมีคำขอนับพันต่อวินาทีเป็นเวลาเกือบทั้งวันนี่คือที่ apache จะบล็อกและพัง

ตัวอย่างโลกแห่งความจริง

Ebay - ในระหว่างการประมูลเมื่อคุณมีการนับถอยหลังใน 30 วินาทีที่ผ่านมา คุณสามารถมีหลายคนที่เคยรีเฟรชหน้าแรงและเพิ่มราคาเสนอ นี่คือที่ node.js ส่องสว่างเพราะวันนี้คุณไม่จำเป็นต้องรีเฟรชอีกต่อไป นั่นเป็นเพราะ JS ajaxes to node.js บ่อยครั้งมาก (300ms ~ 600ms) จากไคลเอนต์ทั้งหมดและสามารถให้ประสบการณ์ "การประมูลในชีวิตจริง" Ebay ไม่ได้ทำงานเพียงอย่างเดียวจาก node.js แต่ในเซิร์ฟเวอร์เซิร์ฟเวอร์ load balance ที่ซับซ้อนมาก

ในการสร้างและติดตั้ง 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'],
  # }
 },

จากนั้นกำหนดค่าปกติ, สร้าง, ทำให้กระบวนการติดตั้ง, 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- เพียงอย่าคาดหวังประสิทธิภาพระดับการผลิต


2
เอาล่ะ ... คุณคิดถูกแล้วว่าคุณต้องการรวม Node.js กับเว็บเซิร์ฟเวอร์ "front-end" เพิ่มเติมเช่น Nginx แต่คุณหมายถึงอะไรโดย "คุณต้องการนักพัฒนา C / C ++"? ตราบใดที่คุณไม่ต้องการทำงานบน Node.js core หรือเขียนโมดูลขึ้นกับแพลตฟอร์มคุณไม่จำเป็นต้องใช้ C / C ++ เลย JavaScript เพียงพอสำหรับนักพัฒนาแอป Node.js ฉันไปไหนมาไหนผิด
Golo Roden

สิ่งที่ฉันหมายถึงคือ node.js เขียนด้วยภาษา C / C ++ - เมื่อฉันทำการค้นคว้าเกี่ยวกับ node.js ฉันพบเว็บไซต์หลายแห่งที่แสดงวิธีการขยายไลบรารี แต่นั่นต้องมีความรู้บริสุทธิ์ใน C / C ++ - สำหรับจุดประสงค์ส่วนใหญ่คุณไม่จำเป็นต้อง - แต่ถ้าคุณเคยอยู่ในสถานการณ์แบบนั้น node.js เป็นทางออกที่ผิด อย่างที่มันเป็นในกรณีของฉัน
Piotr Kula

คำถามของฉันคือ Raspberry Pi-focus --- Raspberry Pi เหมาะกับการให้บริการแอปพลิเคชั่น Node อย่างไร? หากเป็นเช่นนั้นฉันจะปรับ RPi ให้เป็นผลลัพธ์ที่ดีที่สุดได้อย่างไร --- และไม่เน้นโหนด --- วิธีดีหรือไม่ดีเป็นโหนด? แต่ขอบคุณสำหรับความคิดเห็นของคุณ ฉันจะแก้ไขคำถามเริ่มต้นเพื่อให้ชัดเจนยิ่งขึ้น
Marius Butuc

ใช่ฉันตอบคำถามที่ 1- Pi สามารถจัดการ node.js บวกกับ LAMP stack ได้เช่นกัน! วิธีการปรับแต่งมันได้หรือไม่ ที่เปิดให้มีการสนทนา โปรดระบุพารามิเตอร์ที่คุณต้องการปรับแต่งเพิ่มเติมอย่างละเอียดยิ่งขึ้น ฉันยังได้ขยายสิ่งที่ฉันรู้สึกว่าสามารถช่วยในการแสดงได้
Piotr Kula

1
ฉันจะ upvote ถ้าคุณรวมสองคำตอบของคุณเข้ากับอันนี้
Jivings

1

ถาม: Raspberry Pi เหมาะสมกับการให้บริการแอปพลิเคชั่นโหนดหรือไม่?

A: เหมาะมาก :) ไม่ต้องสงสัยเลย

ถาม: ถ้าเป็นเช่นนั้นเราจะปรับ Raspberry Pi ให้ได้ผลลัพธ์ที่ดีที่สุดได้อย่างไร

A: อย่า! เน้นที่การเขียนแอปพลิเคชันโหนดที่ออกแบบมาเป็นอย่างดี การเพิ่มประสิทธิภาพสคริปต์แอปพลิเคชันของคุณเป็นวิธีที่จะไป

ใช้ proxyserver เสมอเช่น nginex เพียงเหตุผลเดียว: Node.JS ยังอยู่ในวัยเด็กของเธอ (เทียบกับ Apache) ดังนั้นคุณสามารถสันนิษฐานได้ว่ายังมีปัญหาด้านความปลอดภัยที่จะค้นพบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.