为Node.js配置Raspberry Pi


15

在阅读有关单页Web应用程序的书时,出现了一段让我思考的段落:

Node.js是非阻塞的并且是事件驱动的。简而言之,这意味着适度硬件上的单个Node.js实例可以处理成千上万的并发打开连接,例如实时消息传递中使用的那些连接,这通常是现代SPA的高度期望的功能。

我注意到将Raspberry Pi用作Rails服务器的情况,那么Node.js呢?

我如何设置我的Raspberry Pi服务于Node.js应用程序?
有没有人尝试过,是否有技巧和窍门,也许有陷阱或需要考虑的限制?


编辑:为了避免误解或偏离主题,让我们将重点放在Node.js上下文中的Raspberry Pi上:

  1. Raspberry Pi是否适合服务Node应用程序?
  2. 在这种情况下,如何微调Raspberry Pi以获得最佳效果?

由于本书全都涉及单页应用程序,因此node.js必须在那里出现。是的,可以用node服务所有内容。但是我怀疑它会在任何生产环境中完成,因为它会变得非常复杂和不友好
Piotr Kula 2013年

您如何更新答案来提出2个具体问题以避免混淆,然后标记出安装node.js的答案,这是很奇怪的,这不是问题吗?您最初的问题是,如何设置它以及任何建议。我为什么还要打扰。大声笑:)
Piotr Kula

1
做出选择后,您似乎仍在编辑;选择答案可以像答案一样进行编辑,因此感谢您指出。:)
Marius Butuc

Answers:


14

在Raspberry Pi上获取Node.js

您可以:

  1. 自己编译Node.js (如ppumkin已经指出的那样)—在Raspberry Pi上花费大约2个小时。
  2. 或者您可以下载二进制v0.8.17

性能

我进行了快速性能测试(给人以第一印象):

  1. 我的Raspberry Pi使用默认的memory_split(64)超频了(Turbo)

  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. Apache Bench设置: ab -r -n 10000 -c 100 http://192.168.0.116:1337/

因此,这些测试不能代表正常的Web应用程序(都涉及网络连接以及所传输内容的长度/复杂度)。

结果

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,并使用默认的“欢迎使用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. 将GPU的memory_split设置为16(最小值)
  2. 将超频模式设置为“ Turbo”以获得最快的RAM / CPU设置

9

网络服务器

Node.JS 可以用作Pi上的Web服务器替代品,并且可以轻松创建独立或单页Web应用程序。

但是,仅供参考,在大多数实际应用中,建议使用服务器,例如现代nginx,轻便lighttpd或矮胖但功能齐全的服务器apache2!然后编写node.js脚本以补充该站点。

显然,可能性无穷无尽,一切都取决于您想要实现的目标。

树莓派?

Raspberry Pi可以运行任何这些Web服务器。它还可以在没有任何严重复杂性的情况下运行Node,并且运行速度非常快,而无需进行任何复杂的调整。

Raspberry Pi非常有能力,但最好的办法是将内存拆分为最少的图形和最多的RAM。不用使用IDE,只需通过SSH完成所有操作即可。如果您确实需要更多果汁,请在BCM芯片上放一个散热器,并在感到安全的情况下对其进行超频。另一个选择是将多个Pi作为群集来帮助实现负载平衡。您可以在这里开始研究集群。

但是,您真的需要使用node.js吗?

Node.JS旨在在您开始(或预期)获取成千上万的请求时需要,这些请求需要将少量数据存储到DB,进行缓存或以最小的服务器开销回读。因此,您可以在客户端上使用JS驱动它,但Node.JS实际上是由C / C ++驱动的。那么,如果您需要自定义模块或基本代码中的特定更改怎么办?

在提供网页服务的应用程序中,例如在单个请求上,node.js通常不会胜过apache。如果您在一天中的大部分时间每秒都有成千上万的请求,则node.js的非阻塞功能非常有用,这是apache阻塞和崩溃的地方。

一个真实的例子

易趣-在拍卖中,您可以倒数30秒。您可能有几个人曾经大力刷新页面并提高了出价。这是node.js的亮点,因为今天您无需再刷新。这是因为JS非常频繁地(300毫秒至600毫秒)从所有客户端移至node.js,并且能够提供“现实生活中的拍卖”体验。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'],
  # }
 },

然后,在通常的配置,制作,制作安装过程中,请注意,我必须手动指定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与其他“前端” Web服务器(例如Nginx)结合在一起。但是,“需要C / C ++开发人员”是什么意思?只要您不想在Node.js核心上工作或不想编写平台相关的模块,就根本不需要C / C ++。对于普通的Node.js应用开发人员而言,JavaScript就足够了。我在哪里弄错了?
Golo Roden 2013年

我的意思是,node.js是用C / C ++编写的-当我对node.js进行研究时,我遇到了很多展示如何在库上扩展的站点。但这需要使用C / C ++的纯知识-对于大多数目的,您不需要-但是,如果遇到这种情况,那么node.js是错误的解决方案。就我而言。
Piotr Kula 2013年

我的问题是针对Raspberry Pi的 --- Raspberry Pi是否适合服务Node应用程序?如果是这种情况,如何调整RPi以获得最佳结果?---而不是专注于节点 --- Node有多好?但是感谢您的意见;我将编辑初始问题以使其更加清晰。
Marius Butuc

是的,我回答了问题1-Pi也可以处理node.js以及完整的LAMP堆栈!如何微调呢?这值得讨论。请更具体地说明您要微调哪些参数?我还扩展了我认为可以帮助提高性能的内容。
Piotr Kula

1
如果您将两个答案合并到这个答案中,我将表示赞同。
Jivings

1

问:Raspberry Pi是否适合服务Node应用程序?

答:非常适合:)毫无疑问。

问:如果是这种情况,如何微调Raspberry Pi以获得最佳效果?

A:不要!专注于编写设计良好的节点应用程序。优化应用程序脚本是必经之路。

出于以下原因,请始终使用代理服务器,例如nginex:Node.JS仍处于童年时代(与Apache相比),因此可以假设仍有安全问题需要发现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.