比较不同的 PaaS 平台上的 Node.js 支持

Node.js相对其他的语言来说可能仍然是年轻的,但是它的虚拟主机却有很多的选择。在这篇文章中,我们就来看看几个“平台即服务(PaaS)”提供商。 

这里不涵盖某些“基础设施即服务(IaaS)”的选择,比如  AWS  和  Joyent,尽管这些选择之中的某些PaaS和IaaS之间的界限有一点点模糊。

在这一轮中,我主要考察两个方面:部署和环境变量的配置。我还把一些有关起步,仪表板的截图和对其它的杂项操作的观察囊括了进来。在以后的文章中,我们将会运行一些基础的性能测试,然后来看看架构伸缩难易程度。 

The Players

Provider Deployment method Environment variables Performance
Nodejitsu CLI CLI or web interface coming soon
Heroku git CLI
Modulus CLI or web upload CLI or web interface
App Fog CLI CLI or web interface
Azure CLI or git CLI or web interface
dotCloud CLI CLI or .yml file
Engine Yard git ey_config npm module
OpenShift git SSH and create file
CloudFoundry coming soon coming soon

设置

我开始于一个非常简单的 Express app,使用 nconf可以提供多种不同的方式,让我们可以给app指定端口,监听我们的应用程序(必要时)以及一个dummy变量,我称之为SECRET。它会先寻找节点命令传递的参数,环境变量,然后从根目录的上一级到我们制定的默认位置,尝试加载的config.json文件。当加载app时,我们能知道变量从外部源加载是否正确。如果错误,加载app时将回滚到默认的SECRET。如果我可以访问app的启动日志,也就可以看到app监听在NODE_ENV上的哪个端口。

最后,我设置"engines": { "node": "v0.10.x" ...到 package.json文件中,就可以看到每个提供者如何响应。

现在没有特定的顺序..

Nodejitsu

https://www.nodejitsu.com/

一个最初的参与者仍然完全地是Node.js的解决方案,当Joyent放弃他们的no.de服务之后Joyent的Nodejitsu成为了官方合作伙伴(惭愧,那真是一个不错的域名).Nodejitsu不再是一个永久免费的中间层.但是个别的方案需要3$每月和有一个30天的免费试用期.

变量配置

根据文档你不需要设置监听端口,只要它是80或大于1024.

设置我们的SECRET来覆盖默认的是相当容易的.您可以使用CLI或web接口列表来设置变量,就像这个名单上其他几个供应商。

部署

发布你的代码到Nodejitsu云是通过一个自定义的命令行接口(CLI)应用程序,安装rpm,注册以后将自动转存到 github 指令版本库但整体安装过程是相当痛苦的,当提示选择一个二级域名,然后会自动添加到package.json文件,在我跑了几个测试中,部署是非常快的. 在每个部署的package.json文件的版本属性是自动递增与的,这不会麻烦我但可能会使另外一些人烦恼. 

我遇到了三个小故障,第一是版本控制,在我部署时有信息输出,我展示下:

info: jitsu v0.12.10-2, node v0.10.4

然而,我被告知0.10.x不是支持价值,只有通过对比到0.8.x时我才能够获得成功.

第二,我尝试在package.json改变属性名称然后就告诉不能部署

第三.我把ENV变量给消除了,每次我都的重新部署,也许有一个方法可以避免.

Misc Notes 和 Dashboard

我喜欢Nodejitsu。任何处理自定义配置都会通过标准的package.json文件。你甚至可以定义定制的predeploy和postdeploy hooks。我对它的印象是,它能非常灵活地部署和查看日志。

比较不同的 PaaS 平台上的 Node.js 支持

Nodejitsu dashboard

 

Heroku

https://www.heroku.com/

PaaS世界的庞然大物, 使用无所不在的Ruby on Rails 构造出的极端流行的平台。

变量配置

同样是使用CLI设置我们的SECRET,用来覆盖默认值。

所有应用在端口5000上运行,所以你需要监听这个端口。

最后,需要创建一个Procfile来说明web应用:node server.js。这只是支持多语言的PaaS的平台的小小的副作用。

部署

Heroku的"toolbelt"CLI是用于管理您的帐户和应用,但部署是通过git,你只需要添加终端他们就会为您提供远程在你的git配置中,因为他们不完全支持Node.js,我很惊喜地发现他们已经支持v 0.10.6,我的第一个部署似乎成功,但是我收到追踪错误引导我发现第一次需要指定有多少资源,我想致力于这个程序:

heroku ps:scale web=1

在那之后,它是一帆风顺的.

杂项说明和控制面板 

对于我自己的项目我没尝试过Heroku直到大约3个月前,部分原因是因为我有一个适度的标准来帮助我调整自己的服务器,及部分原因是因为我认为他们事后处理node.js的,但是如果你能克服他们的不足关于WebSocket支持和一些错误标记和统计,这是一个相当不错的经验.

他们还得到了一个非常优美和功能的控制面板,与一些方便的功能,使你不会感到像其它地方指向S3-hosted文件中的404页面,并且能够将项目的所有权转让给不同的用户。

比较不同的 PaaS 平台上的 Node.js 支持

Heroku dashboard

Modulus

http://modulus.io

.io  后缀是一个相对较新的服务。 关于Node.js, 他们内嵌支持MongoDB 和本地文件存储。

配置变量

配置变量可以通过网页界面或者CLI。我试图在创建SECRET。在尝试并碰到错误后,我发现不能在变量中出现空格!所以奇怪是SECRET模块不能运作。

应用需要监听8080端口, “但我们推荐用端口环境变量 (process.env.PORT).”

部署

部署可以通过CLI来做,但你也可以压缩整个项目并把它通过他们很有趣的网络接口上传。我没有任何问题,部署,但每次要把你整个项目(除了node_modules之外)都打包和上传,这会使它的处理过程比那些使用 git 的“diff”功能或 rsync 的工具慢得多。

至于写作,模块运行于0.8.15版本,并忽略你在 package.json 中指定的任何内容。

其它注意事项和仪表板

我为这些家伙欢呼,并希望他们能继续改善。有个内置MongoDB的选项会是不错的,我喜欢前期定价。

比较不同的 PaaS 平台上的 Node.js 支持

Modulus dashboard

 ###NextPage###

AppFog

http://appfog.com

AppFog先前因PHP Fog而出名,现在已被CenturyLink收购。你可以指定你想使用的云,如不同地区的AWS、HP以及Azure云。 

配置变量

变量可通过web控制台或者CLI(命令行工具)设置。设置私密变量毫无问题。

文档要求监听process.env.VCAP_APP_PORT端口,但我尝试使用默认配置也能正常工作。日志显示它在监听57277端口。

部署

也是借助CLI工具。写这篇文章的时候,AppFog使用v0.8.14版本,并且忽略package.json里的版本设置。

其他注意事项和仪表盘

它的免费计划看起来挺慷慨的。它提供多达8个实例,总共2GB RAM,并可随意分割使用。它也有内置MongoDB的选项。

比较不同的 PaaS 平台上的 Node.js 支持

AppFog dashboard

 

Windows Azure

http://windowsazure.com

变量配置

变量可以通过网络接口或者CLI配置。在我第一次通过CLI配置SECRET的时候遇到了一个比较诡异的小问题,SECRET变成了secret。所以我不得不用网络接口来更正它。

在没有对端口做任何修改的情况下,这个应用跑得很好,但是在日志中发现了一个很奇怪的值: \\.\pipe\bea0dffc-de5b-47f4-8575-4d17c2175fd5

部署

希望微软在这里还能有更多的自定义的东西,因为当有些文件被添加进代码中(名为azure_error and iisnode.yml),CLI会自动通过npm安装同时也会通过git部署。

Azure运行的是0.8.2这个版本,不过这个版本号可以在package.json文件中重新配置。

注意事项和仪表板

帐户创建过程是迄今为止最乏味的包括短信验证一个Windows Live帐户和一个单独用于部署的Git帐户但总体而言,Azure平台的巨大范围来看,仪表板是相当不错的他们支持日志文件至于我可以告诉Heroku唯一这么做的供应商

比较不同的 PaaS 平台上的 Node.js 支持

Azure dashboard

 

dotCloud

http://dotcloud.com

支持多国语言.就像Nodejitsu一样, 他们最近取消了他们的免费服务,所以在开始使用之前需要绑定一张信用卡.

参数配置

参数的设置通过CLI或者一个dotcloud.yml文件设置.

监听端口需要设置为8080.

部署

dotClouds CLI使用Python编写的, 同时使用rsync在每次部署的时候最小化你要上传的数据. 为了帛书,你需要配置supervisord.conf和dotcloud.yml文件。

目前, dotCloud的版本为 0.6.20. Ouch.

注意事项和控制面板

早期的时候我感到非常的愤怒,当他们进行一些重大修改却几乎没有警告的时候。我猜这就是生活在一个beta的世界,但是我一直没有急着跑回来。

比较不同的 PaaS 平台上的 Node.js 支持

dotCloud dashboard

 

Engine Yard

http://engineyard.com

就像Heroku一样, Engine Yard 也是通过Ruby on Rails来托管的。 不过不一样的是, 我们对于安装和环境配置拥有更多的选择。有服务器管理经验的人会觉得Engine Yard更像直接操作某台服务器,不过这仍然是PaaS。

变量配置

我们可以通过npm模块ey_config来配置环境变量。Engine Yard还支持通过SSH来访问你的机器,那样我们就可以直接创建config.json并放到一个正确的地方。

部署

这个是通过git来部署的,不过package.json文件中的node版本号最多只支持0.8.11。

注意事项和控制面板

当我们创建了一个应用,我们需要选择nginx(推荐)作为前端代理或者使用Node.js,后者支持WebSockets。

当我第一次部署失败,会弹出一个可以输入手机号的窗口。

比较不同的 PaaS 平台上的 Node.js 支持

Engine Yard dashboard

OpenShift.com

http://openshift.com

OpenShift 一个主要由Red Hat维护的开源项目, OpenShift.com是一个托管式服务的平台(像WordPress.org 和 WordPress.com).

配置变量

OpenShift.com 支持用SSH连接你的电脑,这意味着你可以新建 config.json 并把它放到合适的地方. 否则, 没有特殊的命令来预先定义配置文件.

端口是 process.env.OPENSHIFT_INTERNAL_PORT || 8080.

部署

用git操作,如果你不是基于网页的GUI的粉丝,尽管有 CLI 用来创建和管理项目. 你需要先将你的公共SSH key加到你的账户中,这是不包括在node.js快速进阶样例的一步。 

package.json文件中的node版本号会被忽略,它会默认使用v0.6.20,不过你可以通过额外的操作来改变它

注意事项和控制面板

之前我对于获取示例应用有些问题,所以我重新开始并让OpenShift用他们的示例文件填充git仓库。这里小小的提示一下,包括deploy hook和一些配置文件都在openshift目录下,README文件展示了结构并说明每个文件的意义。

但是我仍然对监听一个特定IP地址感到困惑,就如下面的:

var ipaddr = process.env.OPENSHIFT_NODEJS_IP || "127.0.0.1";

然后在server.js文件的app.listen中添加 ipaddr, 就像这样:

app.listen(app.get('port'), ipaddr, function(){...

我已经和OpenShift相关人员进行了沟通,他们也将更新入门指南让这部分内容更加得通俗易懂。

比较不同的 PaaS 平台上的 Node.js 支持

OpenShift dashboard

CloudFoundry

http://cloudfoundry.com

首先来看CloudFoundry一个明确、友好入门过程然而,几个屏幕之后我得到了这个消息
*我们正处在一个过渡时期*
您正在阅读V2文档... Cloudfoundry.com20136将被升级V2

所以,我会转回到他们这一系列下一期中

后会有期

 

不用说,这个世界正在迅速的变化着不要把太多的关注放在任何具体细节上,除非检查更新例如,在两天前我写好这篇文章,Modulus发送了一封邮件给我,有关升级版本的Node.js。

以后的文章中将继续监控和测试这些平台的性能然后记录扩展他们的快照在此期间,如果我错过了你最喜欢的Node.js PaaS请让我知道

原文发布时间为:2013-07-09

本文来自云栖社区合作伙伴“Linux中国”

上一篇:在MVC3中编辑页面时Get的参数名与Post里的Model参数一致时不需要在View页面再绑定参数


下一篇:quicklz 接口函数