Mengkonfigurasi Raspberry Pi untuk Node.js


15

Membaca buku di Aplikasi Web Halaman Tunggal Saya sampai pada satu paragraf yang membuat saya berpikir:

Node.js adalah non-blocking dan event-driven. Singkatnya, ini berarti contoh Node.js tunggal pada perangkat keras sederhana dapat menangani puluhan atau ratusan ribu koneksi terbuka bersamaan , seperti yang digunakan dalam pesan waktu-nyata, yang sering merupakan fitur yang sangat diinginkan dari SPA modern.

Saya perhatikan kasus menggunakan Raspberry Pi sebagai server Rails , jadi bagaimana dengan Node.js?

Bagaimana cara saya mengatur Raspberry Pi saya untuk melayani aplikasi Node.js?
Adakah yang mencoba, apakah ada tips & trik, mungkin Gotcha atau keterbatasan untuk dipertimbangkan?


Sunting: Untuk menghindari kesalahpahaman atau di luar topik, mari tetap fokus pada Raspberry Pi, dalam konteks Node.js:

  1. Seberapa cocok Raspberry Pi untuk melayani aplikasi Node?
  2. Jika itu masalahnya, bagaimana kita bisa menyempurnakan Raspberry Pi untuk hasil terbaik?

Karena buku ini semua tentang aplikasi satu halaman, node.js harus membuat tampilan di sana. Ya mungkin untuk melayani semuanya dengan simpul. Tapi saya ragu itu akan pernah dilakukan di lingkungan produksi apa pun karena bisa menjadi sangat kompleks dan tidak ramah
Piotr Kula

Sungguh aneh bagaimana Anda memperbarui Anda menjawab untuk menanyakan 2 pertanyaan spesifik untuk menghindari kebingungan dan kemudian menandai jawaban untuk menginstal node.js- yang bukan pertanyaan? Anda pertanyaan aslinya adalah, bagaimana mengaturnya dan saran apa pun. Kenapa aku bahkan repot. LOL :)
Piotr Kula

1
Sepertinya ketika pilihan dibuat Anda masih mengedit; memilih jawaban dapat diedit seperti jawaban, jadi terima kasih telah menunjukkannya. :)
Marius Butuc

Jawaban:


14

Mendapatkan Node.js di Raspberry Pi

Anda dapat:

  1. Kompilasi Node.js sendiri (seperti yang sudah ditunjukkan ppumkin ) ppumkin —membutuhkan waktu sekitar 2 jam dengan Raspberry Pi.
  2. Atau Anda dapat mengunduh biner v0.8.17

Performa

Saya melakukan tes kinerja cepat (untuk memberikan kesan pertama yang kasar):

  1. Raspberry Pi saya di-overclock (Turbo) dengan memory_split default (64)

  2. Pengujian dilakukan melalui jaringan lokal saya (Wifi 802.11g).

  3. Saya menggunakan contoh standar "Hello World" dari situs 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. Pengaturan Apache Bench: ab -r -n 10000 -c 100 http://192.168.0.116:1337/

Jadi tes ini tidak representatif untuk aplikasi web normal (baik mengenai koneksi jaringan dan panjang / kompleksitas konten yang ditransfer).

Hasil

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)

Sebagai perbandingan, saya juga menginstal nginx pada Raspberry Pi saya dan menjalankan tes yang sama dengan default "Selamat datang di nginx!" File 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)

Mengoptimalkan pengaturan Raspberry Pi

Gunakan raspi-configuntuk mengubah pengaturan berikut:

  1. Atur memory_split untuk GPU ke 16 (nilai terendah)
  2. Atur mode overclocking ke "Turbo" untuk pengaturan RAM / CPU tercepat

9

Server Web

Node.JS dapat digunakan sebagai pengganti server web pada Pi dan Anda dapat membuat aplikasi web yang berdiri sendiri atau Halaman Tunggal dengan mudah.

Tetapi hanya untuk informasi Anda, dalam sebagian besar aplikasi dunia nyata, disarankan untuk menggunakan server seperti modern nginx, ringan, lighttpdatau chunky tetapi berfitur lengkapapache2 ! Dan kemudian skrip node.js untuk melengkapi situs.

Jelas kemungkinan tidak terbatas dan semuanya tergantung pada apa yang ingin Anda capai.

Raspberry Pi?

Raspberry Pi dapat menjalankan server web mana saja. Itu juga dapat menjalankan Node tanpa komplikasi serius dan sangat cepat tanpa mengutak-atik yang rumit.

Raspberry Pi sangat mampu tetapi yang terbaik adalah mengubah pembagian memori menjadi paling tidak grafis dan sebagian besar RAM. Lupakan menggunakan IDE dan lakukan semuanya melalui SSH. Jika Anda benar-benar membutuhkan jus lagi, masukkan heat sink pada chip BCM dan lakukan overclock karena Anda merasa aman. Pilihan lain adalah menggunakan beberapa Pi sebagai kluster untuk membantu dengan load balancing. Anda dapat mulai menggali di sini tentang pengelompokan.

Tetapi apakah Anda benar-benar perlu menggunakan node.js?

Node.JSdimaksudkan untuk digunakan ketika Anda memulai (atau mengantisipasi) untuk mendapatkan ratusan dan ribuan permintaan yang membutuhkan potongan kecil data untuk disimpan ke DB, di-cache atau dibaca kembali dengan overhead server minimal. Jadi Anda mengendarainya menggunakan JS pada klien tetapi Node.JSsebenarnya didorong oleh C / C ++. Jadi apa yang terjadi jika Anda memerlukan modul khusus atau perubahan spesifik pada kode dasar?

Dalam aplikasi yang melayani node.js halaman web biasanya tidak mengungguli apache misalnya, pada permintaan tunggal. Fitur non-blocking dari node.js sangat bagus jika Anda memiliki ribuan permintaan per detik hampir sepanjang hari, di sinilah apache akan memblokir dan crash.

Contoh dunia nyata

Ebay - Selama pelelangan saat Anda memiliki hitungan mundur selama 30 detik terakhir. Anda dapat memiliki beberapa orang yang biasa menyegarkan halaman dengan penuh semangat dan meningkatkan tawaran. Di sinilah node.js bersinar, karena hari ini Anda TIDAK perlu menyegarkan lagi. Itu karena JS ajaxes ke node.js sangat sering (300ms ~ 600ms) dari semua klien dan mampu memberikan pengalaman "lelang kehidupan nyata". Ebay tidak hanya menjalankan node.js tetapi pada server farm seimbang yang sangat kompleks.

Untuk membangun dan menginstal Node.js di Pi *:

Jelas tidak ada yang salah dengan menggunakan node.js daripada yang lain dan cara terbaik untuk belajar simpul jika tidak pada perangkat kecil yang rapi seperti Pi. Jadi Anda bisa mengkompilasi kode sendiri seperti ini.

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

pembaruan: versi terbaru dari simpul (versi saat ini adalah v0.8.18) dapat dibangun tanpa langkah-langkah khusus di bawah ini

selanjutnya kita perlu memberi tahu kompiler untuk menggunakan armv6arsitektur untuk kompilasi:

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

Kemudian komentari baris yang dimulai di sekitar tanda 157, untuk menghapus bagian vfp3 dan simulator. Karena ini adalah objek seperti JSON, ingatlah untuk menghapus koma di CPPDEFINEStelepon!

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

Kemudian seperti biasa mengkonfigurasi, membuat, membuat proses instalasi, NB saya harus secara manual menentukan lokasi libpath OpenSSL:

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

Itu saja, sekarang Anda harus sudah menginstal Node.JS!

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

* Referensi dan artikel asli

Tetapi seperti ditunjukkan dalam jawaban lain, Anda cukup mengunduh biner yang telah dikompilasi sebelumnya yang hanya akan berfungsi.

Kesimpulan

Sepotong Pi yang bagus tidak buruk. Anda dapat menjalankan hampir semua hal pada Pi- Hanya saja jangan mengharapkan kinerja tingkat produksi.


2
Yah ... Anda benar karena Anda kemungkinan besar ingin menggabungkan Node.js dengan server web "front-end" tambahan seperti Nginx. Tapi apa yang Anda maksud dengan "Anda MEMBUTUHKAN pengembang C / C ++"? Selama Anda tidak ingin bekerja pada inti Node.js atau menulis modul yang bergantung pada platform, Anda tidak perlu C / C ++ sama sekali. JavaScript sudah cukup untuk pengembang aplikasi Node.js yang umum. Di mana saya salah?
Golo Roden

Yang saya maksudkan adalah node.js ditulis dalam C / C ++ - Ketika saya melakukan penelitian pada node.js saya menemukan banyak situs yang menunjukkan cara memperluas di perpustakaan. Tapi itu membutuhkan pengetahuan murni dalam C / C ++ - Untuk sebagian besar tujuan Anda tidak perlu - Tapi jika Anda pernah mendarat dalam situasi seperti itu maka node.js adalah solusi yang salah. Kebetulan dalam kasus saya.
Piotr Kula

Pertanyaan saya adalah Raspberry Pi-terfokus --- Seberapa cocok Raspberry Pi untuk melayani aplikasi Node? Jika itu masalahnya, bagaimana saya bisa menyempurnakan RPi untuk hasil terbaik? --- dan bukan Node-fokus --- Seberapa baik atau buruk Node? Tetapi terima kasih atas pendapat Anda; Saya akan mengedit pertanyaan awal untuk membuatnya lebih jelas.
Marius Butuc

Ya saya menjawab pertanyaan 1- Pi dapat menangani node.js ditambah tumpukan LAMP penuh juga! Bagaimana cara menyetelnya? Itu terbuka untuk diskusi. Harap lebih spesifik parameter apa yang ingin Anda sempurnakan? Saya juga memperluas apa yang saya rasa dapat membantu kinerja.
Piotr Kula

1
Saya akan memilih jika Anda menggabungkan dua jawaban Anda menjadi yang satu ini.
Jivings

1

T: Seberapa cocok Raspberry Pi untuk melayani aplikasi Node?

A: Sangat cocok :) Tidak diragukan lagi.

T: Jika itu masalahnya, bagaimana seseorang bisa menyempurnakan Raspberry Pi untuk hasil terbaik?

A: Jangan! Fokus pada penulisan aplikasi simpul yang dirancang dengan sangat baik. Mengoptimalkan skrip aplikasi Anda adalah caranya.

Selalu gunakan proxyserver, misalnya nginex, hanya untuk satu alasan: Node.JS masih dalam masa kecilnya (dibandingkan dengan Apache), sehingga Anda dapat berasumsi bahwa masih ada masalah keamanan yang masih harus ditemukan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.