Keystone是以Express和MongoDB为基础搭建的Node.js CMS和Web应用程序平台。
自从三年前接触到Node.js,我就开始定期在GitHub上搜一下跟Node.js相关的项目。搜索结果列表变得越来越长,这个开发体系也在不断的发展和完善。我眼看着其编程理念、最佳实践、开发工具、库、框架从异彩纷呈到趋于稳定,构建在Node.js平台上的应用程序也越来越多。
Keystone就是我在浏览GitHub上的搜索结果时看到的,它给我的感觉就像是几年前Java圈里的AppFuse。遵循一套开发惯例把一些精选的框架、库和工具集成到一起,可以作为项目的初始模板。但Keystone又不光是项目模板,它还可以当作一个CMS来用。Keystone就像在它的网站上所宣称的那样,“在你需要的功能上领先一步!在Node.js中,用Keystone搭建数据驱动的网站、应用程序和API是最容易的。”
你可以先去看看用Keystone搭建的网站。然后回来跟我们一起看看用Keystone搭建一个网站有多容易!不过我们首先还需要搭一个运行环境。
阿里云上的Node.js
配置云服务器ECS实例
阿里云的服务器配置很简单,分为基本配置、网络、镜像、存储、密码及购买量五大项。对于部署Node.js而言,其中唯一需要注意的就是CPU的内核数量,因为Node.js是单线程应用,所以选择1核就够了。因为用于测试,所以我们选择了2G内存、1M带宽,所用的操作系统是Ubuntu 14.04 64位。下图是本文所用实例的配置:
- 图1-阿里云ESC实例配置
安装NVM,Node.js与MongoDB
现在我们有了一台干净的Ubuntu服务器,可以在上面安装Node.js和MongoDB了。如果你不想用付费的阿里云主机,也可以找一下免费的云主机,或者在本机上用虚拟机创建一个Linux镜像,对我们后面的过程来说应该都是一样的。
NVM与Node.js
nvm是专为Node.js设计的工具,其名称是Node.js version manager的缩写。使用nvm可以管理多个不同版本的Node.js环境,更便于以后的升级维护。nvm的安装也很简单,不过在那之前,我们要先在刚才创建的实例里添加一个用户。虽然用root也可以安装nvm,但会因为访问权限的原因遇到一些小麻烦,并且那也不是个好习惯。
在终端窗口中通过ssh连接到刚创建好的实例上,如果是在Windows环境下,也可以通过putty连接。点击阿里云实例管理界面上的“连接帮助”可以看到详细的帮助信息。连接进去之后先创建用户,按提示提供相关信息,设置密码:
useradd demo
然后将这个用户添加到sudo用户组:
useradd demo sudo
切换为demo用户:
su - demo
接下来先安装nvm构建必需组件所需的工具包:
sudo apt-get update
sudo apt-get install build-essential libssl-dev
工具包安装好以后,到nvm的GitHub项目主页上找到下载并执行安装脚本的wget命令(可能会有不同的版本号),在终端中执行:
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh | bash
因为安装nvm会修改 ~/.profile
文件,所以你需要退出再登录demo用户,或者执行下面的命令,以便让当前会话了解这个变化:
source ~/.profile
至此为止,我们的nvm就已经安装好了,接下来可以用它安装Node.js了。
要查看有哪些版本的Node.js可以安装,可以执行下面的命令:
nvm ls-remote
写这篇文章时的最新版本是0.12.4,所以我们用nvm安装了这个版本:
nvm install 0.12.4
nvm一般会将默认的Node.js切换为最新安装的版本,我们也可以特别指明要用哪个版本:
nvm use 0.12.4
安装完成后,执行一下node -v可以看到当前所用的版本号。
安装MongoDB
在Ubuntu上安装MongoDB也很简单,只需要4步:
- 导入包管理系统需要用到的公钥:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
2.为MongoDB创建list文件:
echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
3.重载本地包数据库
sudo apt-get update
4.安装最新版的MongoDB
sudo apt-get install -y mongodb-org
装好之后将它作为服务启动:
sudo service mongod start
如果你用的是其它操作系统,请参考MongoDB官网上的安装指南。
Keystone应用Demo
准备工作完成了,接下来进入我们的主题。
Keystone提供了一个Yeoman生成器,可以用它生成一个Keystone脚手架项目,作为你后续开发的基础。Yeoman生成器的使用非常简单,首先用npm全局安装:
npm install -g generator-keystone
然后在指定的目录下运行:
yo keystone
生成器会提出几个问题,主要是你想要什么功能,然后进行配置,并把你需要的所有文件复制到你的项目目录中。它还会从npm中安装依赖项,帮你做好准备。
你刚刚创建了自己的第一个KeystoneJS项目,恭喜你!在命令行中运行:
node keystone
打开http://localhost:3000,看看Keystone给我们生成了一个什么样的项目。整个过程只需要几分钟,一行代码也没有写,只用几个命令你就得到了一个带有博客、图片库、联系表单的网站,而且还有后台管理界面。 如果你想深入了解Keystone,请参阅其官方文档。
中军帐内听云起
监测分析系统与压力测试
一个没有接入监测分析系统的网站不能算是一个完整的网站。监测分析系统能提供网站访问情况的重要数据,是了解用户使用习惯和进行性能分析的重要依据。性能对网站流量有十分巨大的影响,这是业界共识。而网站的调优主要取决于性能分析。“分析”的意思是指找出究竟是什么拖慢了网站的速度,如果你在加快内容渲染上投入了大量的精力,但实际上问题却是出在跟外部社交网站连接的插件上,那你不仅仅是浪费了时间和金钱,还会导致大量客户的流失。
目前支持Node.js的监测分析系统还不是很多,我们这里用了简单易用的听云Server。但这个演示用的网站不可能有什么访问量,所以我们决定用压力测试工具loadtest来制造一些访问请求。
loadtest的安装和使用很简单,首先在终端窗口中输入下面的命令安装:
sudo npm install -g loadtest
loadtest可以加在构建文件中作为任务执行,也可以作为脚本独立发起请求,为了简单起见,我们这里将它作为脚本执行。针对Keystone的Demo应用,我们可以打开三个终端窗口,分别对不同的URL发起请求:
loadtest -c 5 --rps 5 http://localhost:3000/gallery
loadtest -c 5 --rps 3 http:// localhost:3000/blog
loadtest -c 5 --rps 6 http:// localhost:3000/
其中参数-c
用于指定并发请求数量,参数--rps
用于指定每秒发起请求的次数。loadtest功能很强大,感兴趣可以自行查阅loadtest在GitHub上的项目主页。
听云Server
听云Server通过在服务端应用中植入探针,实现对应用代码、关系型数据库、非关系型数据库、外部服务的监控;即时获取相关性能数据并进行智能分析,发现应用性能问题并定位性能瓶颈,提供性能问题诊断、追踪及优化依据。目前支持Java、PHP、.Net和Node.js探针。网站上的安装文档和使用说明也很详细。所以我们这里只是简单介绍一下部署和设置的过程,最后再看一下它的监测分析结果。
部署
在听云网站注册后,进入控制台,首先点击右上角的“新建应用”按钮,进入探针下载页面。这个页面上有个License Key,把它复制下来,后面配置时会用到。然后选择要安装的语言包,对我们来说当然是Node.js。接下来点击下一步。
按照页面上的指示操作:
- 一. 执行安装探针命令
- 二. 修改配置文件信息
- 三. 重新启动应用服务器
其中第二步里的“修改nodejs启动主文件,将 require(‘tingyun’)添加到首行”,就是修改项目根目录下的keystone.js文件。
应用警报通知
听云Server提供了丰富的设置选项,可以根据自己的需要定制监测分析目标和规则。对于我们来说,最基本的是首先设置应用警报通知,听云Server目前提供了两种警报通知方式,在应用的性能和错误率警报阈值达到设置值时通过邮件和短信发送通知。
警报阈值在“设置->应用阈值设置”页面内进行设置,可以分为两个级别,分别是橙色阈值和红色阈值。 当应用的性能或错误率超过橙色阈值5分钟后将触发“警告”的警报事件;当超过红色阈值3分钟后将触发“严重”的警报事件,并触发警报通知动作。 红色阈值必须高于橙色阈值 应用性能警报阈值使用Apdex分数来作为警报基线,橙色和红色阈值可分别在以下Apdex分数值中选取:
- 无(不设置该等级的性能阈值)
- 0.94,对应Apdex的“优秀”级别
- 0.85,对应Apdex的“一般”级别
- 0.70,对应Apdex的“不满意”级别
- 0.50,对应Apdex的“难以忍受”级别
错误率阈值可由用户手工填写1到100的百分数,其中橙色阈值缺省值为1%,红色阈值的缺省值为5%。红色阈值必须大于橙色阈值。
警报阈值设置好以后,就可以到“设置->警报通知设置”页面设置自己接收报警所用的邮箱和手机号了。
监测分析数据图表
听云Server不仅提供了丰富的分析数据,数据可视化工作也做得可圈可点。可以在监测页面上直观的看到各种监测结果,下面来看一下在上面的压力测试下看到的几个监测结果页面。
情报汇总
- 图2 情报汇总
Web应用过程
Web应用过程页面汇总显示了监测期内所有收到过的请求的监测结果。
- 图3 Web应用过程汇总
点击左侧栏的应用过程,还可以看到该应用过程的详细数据。包括该应用过程相关的MongoDB查询的监测结果。
- 图4 选定Web应用过程
NoSQL
在NoSQL页面中可以看到所有MongoDB操作时长。
- 图5 MongoDB操作时长汇总
还可以看到响应时间曲线。
- 图6 MongoDB响应时间曲线
总结
从创建阿里云主机到看到听云的应用监测分析结果,整个过程所用的时间还不到1个小时。随着各种库和工具的不断发展,Node.js作为Web应用开发生态体系的生产效率越来越高,加上有听云这样优秀的监测分析系统助力,产品推出后的调优和维护也越来越容易。
然而这些平台和产品虽然可以降低我们进入的门槛,但并不会降低开发Web应用程序时对我们的要求。所幸的是这些知识的体系和脉络越来越清晰,不同平台和环境之间的共识也越来越强烈。除了初学者,我相信即便是经验丰富的开发人员,也需要不断学习新的知识才能跟上技术发展飞速的脚步。