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


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

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

我如何设置Raspberry Pi来提供服务? Node.js应用程序?
有人尝试过吗,是否有提示和技巧,可能需要考虑一些陷阱或局限性?


编辑:为避免造成误解或偏离主题,请在Node.js上下文中,将注意力集中在Raspberry Pi上:


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


评论

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

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

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

#1 楼

在Raspberry Pi上获取Node.js

您可以:


自己编译Node.js(如ppumkin所指出的),大约需要2个小时树莓派。
或者您可以下载二进制v0.8.17


性能

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


我的Raspberry Pi超频(Turbo),具有默认的memory_split(64)
测试是在我的本地网络(802.11g Wifi)上进行的。

我使用了来自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/');


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更改以下设置:


将GPU的memory_split设置为16(最低值)
将超频模式设置为“ Turbo”以实现最快的RAM / CPU设置


#2 楼

Web服务器

Node.JS可以用作Pi上的Web服务器替代品,您可以轻松创建独立或单页Web应用程序。在大多数实际应用中,建议使用服务器,例如现代的nginx,轻巧的lighttpd或矮胖但功能齐全的apache2!然后编写脚本node.js来补充该站点。

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

Raspberry Pi?

Raspberry Pi可以运行任何这些Web服务器。它也可以在没有任何严重复杂性的情况下运行Node,并且运行速度非常快,而无需进行任何复杂的调整。不用使用IDE,只需通过SSH完成所有操作即可。如果您确实需要更多果汁,请在BCM芯片上放一个散热器,并在感到安全的情况下对其进行超频。另一个选择是将多个Pi作为群集使用,以帮助实现负载平衡。您可以在这里开始研究有关集群的信息。

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

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

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

Ebay-在拍卖期间,您要倒数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上运行任何东西-只是不要期望生产水平的性能。

评论


好吧...您很正确,因为您很可能希望将Node.js与其他“前端” Web服务器(例如Nginx)结合在一起。但是,“需要C / C ++开发人员”是什么意思?只要您不想在Node.js核心上工作或不想编写与平台相关的模块,就根本不需要C / C ++。对于普通的Node.js应用开发人员而言,JavaScript就足够了。我在哪里弄错了?

– Golo Roden
13年1月23日在19:42

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

– Piotr Kula
13年1月23日在19:48

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

– Marius Butuc
2013年1月23日20:16



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

– Piotr Kula
13年1月23日在21:01

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

–活动
13年1月23日在21:05

#3 楼

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

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

问:如果是这样,怎么做?可以微调Raspberry Pi以获得最佳效果吗?

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

总是使用代理服务器(例如nginex),原因有一个:Node.JS仍处于童年时代(与Apache相比),因此您可以假设仍有安全问题要发现。