Node.js是非阻塞的并且是事件驱动的。简而言之,这意味着适度硬件上的单个Node.js实例可以处理成千上万的并发打开连接,例如实时消息传递中使用的那些连接,这通常是现代SPA的高度期望的功能。 />
我注意到将Raspberry Pi用作Rails服务器的情况,那么Node.js呢?
我如何设置Raspberry Pi来提供服务? Node.js应用程序?
有人尝试过吗,是否有提示和技巧,可能需要考虑一些陷阱或局限性?
编辑:为避免造成误解或偏离主题,请在Node.js上下文中,将注意力集中在Raspberry Pi上:
Raspberry Pi如何适合服务于Node应用程序?
在这种情况下,如何微调Raspberry Pi以获得最佳效果?
#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相比),因此您可以假设仍有安全问题要发现。
评论
由于本书全部涉及单页应用程序,因此node.js必须在那里出现。是的,可以用node服务所有内容。但是我怀疑它会在任何生产环境中完成,因为它会变得非常复杂和不友好您如何更新答案以提出2个具体问题以避免混淆,然后标记出安装node.js的答案,这很奇怪,这不是问题吗?您最初的问题是,如何设置它以及任何建议。我为什么还要打扰。哈哈:)
做出选择后,您似乎仍在编辑;选择答案可以像答案一样进行编辑,因此感谢您指出。 :)