1.2. 统一环境
开发环境
- nvm
- nrm
- nodejs 0.10.38
- node-inspector
部署环境
- nvm
- nrm
- iojs 2.x
- pm2
- nginx
异步流程控制:Promise是唯一选择,而且从一开始就要强制使用,绝不可忽略,这关系到设计思维的巨大差异,甚至关系到我们是否真正能够在 node.js方向坚持下来。我们用Q.js,和前端Angular.js使用的微缩版Q.js保持一致,减少学习周期。
1.4. 启动开发模式
因为我们在开发过程中总是希望修改后立即看到效果,而不是每次都要终止进程并重启。
supervisor 可以帮助你实现这个功能,它会监视你对代码的改动,并自动重启 Node.js
开发模式我推荐 supervisor
安装
npm install --save supervisor
启动
supervisor app.js or supervisor www/bin
我的实践是把package.json里的start
"scripts": { "d": "node-debug app.js", "start": "./node_modules/.bin/supervisor app.js" }
然后
还有一个库也不错,叫nodemon
see http://nodemon.io/
1.5. 调试模式
推荐node-inspector
安装
npm install --save node-inspector
启动
node-inspector app.js or node-debug www/bin
我的实践是把package.json里的d里
"scripts": { "d": "node-debug app.js", "start": "./node_modules/.bin/supervisor app.js" }
然后执行
npm run命令详解,见https://github.com/i5ting/npm-run-test
1.6. 启动产品上线模式
产品模式我们推荐使用pm2
pm2是非常优秀工具,它提供对基于node.js的项目运行托管服务。它基于命令行界面,提供很多特性:
- 内置的负载均衡器(使用nodecluster module)
- 以守护进程运行
- 0s(不间断)重启
- 为ubuntu/ CentOS 提供启动脚本
- 关闭不稳定的进程(避免无限死循环)
- 基于控制台监控
- HTTP API
- 远程控制以及实时监控接口
pm2使用nodecluster构建一个内置的负载均衡器。部署多个app的实例来达到分流的目的以减轻单app处理的压力。
安装pm2
查看基本帮助文档
Basic Examples: Start an app using all CPUs available + set a name : $ pm2 start app.js -i 0 --name "api" Restart the previous app launched, by name : $ pm2 restart api Stop the app : $ pm2 stop api Restart the app that is stopped : $ pm2 restart api Remove the app from the process list : $ pm2 delete api Kill daemon pm2 : $ pm2 kill Update pm2 : $ npm install pm2@latest -g ; pm2 updatePM2 More examples in https://github.com/Unitech/pm2#usagefeatures Deployment help: $ pm2 deploy help
上面基本是我们比较常用的
1.7. pm2的最佳实践
把启动写到json配置文件中
// 20150531071243
// https://raw.githubusercontent.com/RocketChat/Rocket.Chat/master/pm2.production.json { "apps": [ { "name": "rocket.chat.0", "max_memory_restart": "1024M", "log_date_format": "YYYY-MM-DD HH:mm:ss SSS", "script": "/var/www/rocket.chat/bundle/main.js", "out_file": "/var/log/rocket.chat/app.log", "error_file": "/var/log/rocket.chat/err.log", "port": "8080", "env": { "CDN_PREFIX": "//dbde4sd21oahf.cloudfront.net", "MONGO_URL": "mongodb://localhost:27017/rocketchat", "MONGO_OPLOG_URL": "mongodb://localhost:27017/local", "ROOT_URL": "http://rocket.chat", "PORT": "8080" } }, { "name": "rocket.chat.1", "max_memory_restart": "1024M", "log_date_format": "YYYY-MM-DD HH:mm:ss SSS", "script": "/var/www/rocket.chat/bundle/main.js", "out_file": "/var/log/rocket.chat/app.log", "error_file": "/var/log/rocket.chat/err.log", "port": "8081", "env": { "CDN_PREFIX": "//dbde4sd21oahf.cloudfront.net", "MONGO_URL": "mongodb://localhost:27017/rocketchat", "MONGO_OPLOG_URL": "mongodb://localhost:27017/local", "ROOT_URL": "http://rocket.chat", "PORT": "8081" } }, { "name": "rocket.chat.2", "max_memory_restart": "1024M", "log_date_format": "YYYY-MM-DD HH:mm:ss SSS", "script": "/var/www/rocket.chat/bundle/main.js", "out_file": "/var/log/rocket.chat/app.log", "error_file": "/var/log/rocket.chat/err.log", "port": "8082", "env": { "CDN_PREFIX": "//dbde4sd21oahf.cloudfront.net", "MONGO_URL": "mongodb://localhost:27017/rocketchat", "MONGO_OPLOG_URL": "mongodb://localhost:27017/local", "ROOT_URL": "http://rocket.chat", "PORT": "8082" } }, { "name": "rocket.chat.3", "max_memory_restart": "1024M", "log_date_format": "YYYY-MM-DD HH:mm:ss SSS", "script": "/var/www/rocket.chat/bundle/main.js", "out_file": "/var/log/rocket.chat/app.log", "error_file": "/var/log/rocket.chat/err.log", "port": "8083", "env": { "CDN_PREFIX": "//dbde4sd21oahf.cloudfront.net", "MONGO_URL": "mongodb://localhost:27017/rocketchat", "MONGO_OPLOG_URL": "mongodb://localhost:27017/local", "ROOT_URL": "http://rocket.chat", "PORT": "8083" } } ] }
部署
pm2 deploy ecosystem.json production setup
第一个傻瓜原则,你的机器有几核,你就几个实例
Start an app using all CPUs available + set a name : $ pm2 start app.js -i 0 --name "api"
上面的配置文件了配置了4个,你应该能自己估算出点什么
第二个傻瓜原则,想机器瘫痪么?最简单的办法是内存不足,怎么样能防止内存被吃尽呢?
很简单,和lru cache一样,设置最大可用内存,防止内存用爆
参数里
--max-memory-restart <memory> specify max memory amount used to autorestart (in megaoctets)
配置文件了也一样
"max_memory_restart": "1024M",
4个实例,每个可占用内存为1G,那么你应该能自己估算出点什么
第三个傻瓜原则,敏感信息咋办?有2种办法
- 使用config/default.example.json。部署的时候拷贝一份,然后按需修改
- 使用pm2的env,在环境变量里配置,pm2的json是在服务器上生成的,每个服务器都要生成一次的
推荐pm2的env这种方式,相对更简单点
第四个傻瓜原则,集群状态下的应用应该是stateless的(无状态),不能依赖代码去做一些事儿的,比如自己写队列处理cache
因为每个实例都是独立的,你读写不是全局的,一定会有各种问题,尽量使用第三方独立的服务,比如配置文件(非实例下面),比如redis等缓存,db等
1.8. pm2高级用法
1.8.1. reload
启动的时候会指定一个名字,以后根据该名字,进行特定操作
它的好处是0秒延时,可以和nginx -s reload 媲美
1.8.2. monit
更多内容 https://github.com/Unitech/PM2#monitoring
1.8.3. 日志
更多内容 https://github.com/Unitech/PM2#log-facilities
$ pm2 logs
$ pm2 logs big-api $ pm2 flush # Clear all the logs
1.8.4. web
访问 http://127.0.0.1:9615
1.8.5. 开机启动
注意:示例的package.json里给出的是centos里增加开机启动项,如果是其他操作系统,请自己更改
更多内容 https://github.com/Unitech/PM2#startup-script-generation
$ pm2 startup <ubuntu|centos|gentoo|systemd>
开机启动,还要注意的一点是要保存一次pm2运行数据的
1.9. 要不要nginx 或者 haproxy ?
nginx
- 主要做反向代理和静态资源处理(如果没有cdn,就把public下的内容放到nginx里)
- 负载
- 阻止了很多常见的攻击和慢客户端
nginx负载对应多台机器,每台机器里起多个(cpu个数)实例,单机负载使用pm2管理。
nginx和haproxy都是针对多台机器的负载,功能差不过,使用和插件方面,nginx稍强一点,知名度更高一点
1.10. 另外一种部署方式
passenger是rails部署时常用的服务器,不过庆幸的是这帮货出了node版本,而且性能不错
有兴趣的可以去研究一下 nginx + passenger
1.11. mongodb的部署
- 安全 https://cnodejs.org/topic/54cdd026ef1b48510c27e07a
- 集群 http://www.linuxidc.com/Linux/2015-02/113296.htm
1.12. redis部署
http://www.linuxidc.com/Linux/2014-07/104306.htm
1.13. 简单压测
1.14. node cluster和nginx负载性能比较
todo
别人测试的node的性能稍高,不过我还是想自己测测
1.15. 性能调优
todo
1.16. keeplive
- http://www.bubuko.com/infodetail-260176.html
1.17. 监控
- newrelic https://cnodejs.org/topic/53fde58d7c1e2284785cd39e
1.18. 资源
- http://promotion.pm2.io/
- https://github.com/Unitech/PM2
- https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps
如果你正在找Node.js的学习资料及指南,那么请继续(阅读),我们的教程将会覆盖即时聊天应用、API服务编写、投票问卷应用、人物投票APP、社交授权、 Node.js on Raspberry Pi等等。
以下是Node.js入门的简单介绍,如果你对Node.js略有了解可以直接跳过此部分。
那什么是Node.js呢?
Node.js是迄今运用最多的服务端JavaScript运行时环境,使用JavaScript开发跨平台的实时WEB应用。
Node.js基于Google的V8 JavaScript引擎。基于事件驱动,非阻塞的输入输出模型,这也使得其高效而轻量。
imqipan
翻译于 8个月前
1人顶
Node.js的强大之处在于其能力支持数据密级性的交互应用,因为这类应用的函数围绕着用户事件,数据I/O和数据流的处理。对于JSON的API,Node.js同样显得很神奇,它是单页WEB应用的心脏和灵魂。
Node.js的流行程度可以感觉得到,像eBay、target、City Group、Sony、Uber、LinkedIn、Medium、Netflix等等的大公司都有在他们的web项目中应用。
怎样学习Node.js呢?
Node.js的开发者来自全球,他们用Node.js开发复杂交互的,数据密集型的WEB Apps和网站。同时网上有着大量的资源和教程教你怎样构建自己的Node.js应用。
我们不防看看Node.js大神针对Web Apps写的Node.js最佳指南。
我们所覆盖的指南将包括针对初学者的Node.js、中级指南,同时还有教你怎样构建复杂的Node.js项目。
imqipan
翻译于 8个月前
0人顶
对于完全的Node.js初学者, 在深入挖掘本文章后续提到的学习项目之前,一步步按照airpair.com上面入门指南的要点 或 Node.js入门指南 之类的文章学习是不错的选择。Nodeschool.io是另一个比较好的网站,上面有着非常多的资料,可以学习基本的node.js及相关的技术。
通过Express框架和Socket.io构建即时通讯APP
将一个新技术学到一定高度的最好方式就是通过功能性的应用了。在这个指南中,你将学习使用Express框架和Socket.io构建即时通讯应用,这些技术可以使用基于事件的双向通信。在这个指南中,你还将使用JavaScript模板引擎Jade。
我们要介绍的指南由Krasimir Tsonev所撰写,发布在tutsplus.com上面,从node.js的环境搭建,使用Express框架的后端服务,到最后使用Jade模板引擎的前端UI开发,覆盖了所有前端到后端的方方面面。
你可以在后面这个链接中找到这篇指南: 即时通讯(Node.js Tutorial – Real Time Chat) .
imqipan
翻译于 8个月前
0人顶
使用Swagger创建Restful API
这个精心设计的教程解释了如何使用Swagger来创建Rest API,并且包括了Rest API应该支持的所有操作(CRUD,创建,查询,更新,删除)。这个例子是由来自scotch.io的Samuela Zara提供的,它实现了管理电影集合的Rest API。
Swagger是一个非常强大的框架来描述REST APIs,它提供了交互式的API文档编辑,客户端sdk生成以及发现服务。通过使用Swagger,你所书写的API将更容易被大家所理解并且使用。
在这个教程中,Samuela一开始先教会大家如何安装node.js的Swagger模块,然后介绍了Swagger提供的模拟模式。通过这个模式,API开发者可以先集中精神进行API本身的设计,而不用写一行的代码。当这个API结构被设计完成之后,教程开始带领大家具体实现获取电影,增加/修改电影以及删除电影的操作。
你可以通过Restful API in Node.js using Swagger这个链接来访问该教程。
HAILINCAI
翻译于 8个月前
0人顶
在 Node.js 中使用 Nodal 建立 API Services
在大多数模块和框架之上,你就不会需要再建立任何简陋的 JavaScript/Node.js 项目。为了多平台(移动端,web,IOT)产品开发,面向服务的架构是关键的,而本教程就将带你更进一步。
在本教程中,Keith Horwood 利用 Nodal 框架在 Node.js 中来创建 API services,并让这一切看起来极其简单。Nodal 是一个可扩展的,以意见为依据的全服务框架,它帮助数据中心加快在 Node.js 基础上的API创建。
在本教程中,你将会在开发 MVC (模型,控制器和视图)之前安装 node.js 环境,安装 Nodal 和 postgreSQL。
你可以在这里找到本教程: 在 Node.js 中使用 Nodal 建立 API Services.
无若
翻译于 8个月前
0人顶
Node.js Apps - 使用通行证进行社交认证
社交认证几乎随处可见,因为我们绝大多数人在Facebook 、Twitter和Google这样的某个社交网络上都有自己的账号。社交网络认证的工作过程是使用已有的社交网络证书进行单点登录,同时可以登录到其它的程序。
在本教程中,你会构建一个简单的Node.js程序,通过使用通行证作为中间件使用社交认证进行登录。本教程由Agraj Mangal编写,发表在tutsplus.com网站上。
要获得本教程可访问链接Node.js Apps - Social Authentication with Passport.
使用Rethink DB和Node.js开发投票App
本教程主要针对的是对Node.js有基本理解的初学者。在本教程中,你能通过开发一个简单的投票app学习Node.js,该程序给用户提供投票的三个选项,并提供投票人数的实时更新。
Angular和angural素材设计库用于程序的前端设计,Node.js用于服务器端,rethink DB用来存储投票数据和相关联的用户数据。
通过编写完成这样一个简单的程序,你就可以掌握创建整个程序的方方面面。
要获得本教程可访问- Polling App using Rethink DB and Node.js.
昌伟兄
翻译于 8个月前
0人顶
角色投票系统 – Node.js, React, MongoDB and Socket.io
这个教程是为有一定基础的nodejs开发人员量身定做的,如果你是一个nodejs的初学者,那么这个教程并不适合阅读。这是一篇由Sahat Yalkabov编写的经过精心组织的教程,目的是为多人在线游戏(Eve Online)开发一个角色投票应用,这是一个功能完整的项目。Eve Online是一个多人在线游戏,每个玩家都有一个3D形象来代表他们的角色。
这篇教程覆盖了一下这些内容:使用Node.js Express 框架创建REST API, 使用MongoDB进行数据的存储,使用Socket.IO实时跟踪在线的访问者,使用React(和Flux)进行服务器端的页面绘制,并且最终将这个引用部署到云端。通过这个教程,你不仅能建成一个对Eve Online进行角色头像投票的系统,而且还可以通过充满乐趣的方式学习到许多的知识。
你可以通过下面的链接访问这个教程 - Character Voting App – Node.js, React, MongoDB and Socket.io
HAILINCAI
翻译于 8个月前
0人顶
使用 Node.js 和 Reactive.js 的 WI-FI 仪表板
这个教程是由 Marcello La Rocca 在 Sitepoint.com 上编写的,适合中级的 Node.js 编程者。Marcello 的引领来自之前的系列教程,它还引导建立了一个仪表板添加更多关于周围可连接 Wi-Fi 的信息。
在这个教程中,你实现的服务器运行在Ubuntu上,做一点小修改也可以运行在windows和mac上。服务器实现的扩展来自于 Marcello 之前的教程 - 使用 Node.js创建电池。实现服务器搭建之后,你编写客户端和用户接口并使用HTML模板给当前的 Wi-Fi 列表。
你可以找到这个教程 使用 Node.js 和 Reactive.js 编写 WI-FI 仪表板。
无若
翻译于 8个月前
0人顶
测试驱动的开发 - Node.js 和 Mocha
这篇由Semaphoreci.com提供的教程将交会你如何使用Mocha来进行单元测试和集成测试。
Mocha是一个JavaScript测试框架,它既可以运行在浏览器中,也可以运行在Nodejs环境中。Mocha将按照顺序执行所有的测试,并将出现的未捕获异常映射到相应的测试用例上。
你可以通过使用npm来引入mocha模块。这个教程中的例子实现了一个颜色转换程序,这个程序将RGB转换成16进制形式。这个教程还创建了一个web服务器来测试异步代码。
你可以通过下面的链接Test Driven Development – Node.js and Mocha找到这个教程。
HAILINCAI
翻译于 8个月前
0人顶
在树莓派上使用Node.js
这篇Node.js教程是"在创造中学习"(learning through making)系列的一部分,该系列由Dave Johnson编写,发表在thisdavej.com网站上。通过本教程,你能学会在树莓派2和树莓派3上安装Node.js。本教程自始至终主要关注的是在树莓派上安装Node.js。 学完本教程后,你可以进一步学习本系列中的其它教程,以便学会在树莓派上使用Node.js,教程包括“探索使用Node.js在树莓派上创建因特网web服务器”和“不用编码而只使用node.js创建web服务器”。
要获得本教程和其它相关的教程可访问Node.js on Raspberry Pi。
Node.js教程:开发情绪分析应用
这是另一篇优秀的教程,由Scott Rich编写,发表在IBM developerWorks上。本教程使用Node.js, Express框架, Sentiment模块和ntwitter模块开发了一个基于推特进行情绪分析的小型程序。 在本教程中,你将学习设置express框架,运行并测试hello Node.js程序,以确保框架工作正常,为程序添加情绪分析功能,并将程序连接到twitter,最后将它们整合在一起,以形成一个功能完整的程序。
在Twitter Sentiment Analysis App in Node.js上可以找到这篇教程。
贴士 1: 在开发环境使用 nodemon, 在生产环境使用pm2
当你第一次开发Node.js应用的时候, 其中一件事情就是一次又一次的运行[file].js 就和揭伤疤一样。 当我第一次开发的node app时候,这个让我感到异常挫败和痛苦, 尤其是每当我修改很小东西的时候需要control+c
幸运的是我发现了一个非常棒的工具Nodemon 。 你可以利用以下的命令来安装
Nodemon 是一个令人惊叹的工具, 当你全局安装它以后, 可以通过 nodemon [file].js 来启动你的node.js scripts,它会告诉nodemon来监视你的script和scripts的所有变化, 这样的Node.js开发方式非常震撼以及让大大提高开发速度。
那么,生产环境又如何, 除非你用了heroku ,Nodejitsu 或者其它一些好的 Node.js 平台(也许它们有类似的功能), 但是碰巧你用了EC2 或者一些其它的云平台来运行你的Node.js app, 你如何能然保证这是一个始终运行的Node.js app
案就是PM2, PM2 是一个类似于Nodemon的工具,不同之处在于它用于生产环境, 和Nodemon相似的地方在于它会监控你的app的任何修改或者重新部署,但是有更好的一面, PM2 在遭遇到崩溃的时候,它会正确重启你的app。
PM2的优胜之处在于当你要将app需要多核处理的时候,PM2内部集成的负载均衡可以让你很容易的去指定运行多少个实例。
-i 参数目的是指定运行多少个实例,在这个例子中 PM2 使用了一个常量max 来扩展你的app运转到你最大的核数,不要忘记Node 平时只会运行在单核!
贴士 3: 轻松调试 Node.js apps
如果你从一个IDE重度集成的语言比如java 或者C# 转来调试Node.js, 你一定会感到很困扰, 大部分新加入node的开发者采用了’flow’的调试模式,从这一刻开始你最好的朋友就是console.log
但是依然有更常见的调试方式来代替, Node.js 内置了一个调试器你可以称为 node debug, 不过我更喜欢的 node-inspector
它们的github说 “Node Inspector 是一个使用Blink Developer Tools (以前称为WebKit Web Inspector)node.js调试器的界面,”
简而言之,node-inspector 可以让你用任何你想用的编辑器和chrome web tools来调试你的应用,这是多么的性感。
Node-inspector 可以让你做一些非常酷的事情,比如实时修改,单步调试,注入以及一堆其它非常酷的东西。
让我们来根据指示一步一步安装
https://github.com/node-inspector/node-inspector
贴士 4: Nodefly
一旦你有你的应用程序正常运行,你可能会问自己,你怎么可以监视它的性能和配置文件,以确保您的应用程序运行在最佳的速度。最简单的答案是一个卓越的服务,我称为Nodefly。
用简单的一行代码Nodefly开始监视你的应用程序内存泄漏,测量redis用了多久,mongo查询和一堆其它很酷的东西。
http://www.nodefly.com
|