比较不同的 PaaS 平台上的 Node.js 支持
| 2013-07-09 08:12
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。我对它的印象是,它能非常灵活地部署和查看日志。
Heroku
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页面,并且能够将项目的所有权转让给不同的用户。
Modulus
.io 后缀是一个相对较新的服务。 关于Node.js, 他们内嵌支持MongoDB 和本地文件存储。
配置变量
配置变量可以通过网页界面或者CLI。我试图在创建SECRET。在尝试并碰到错误后,我发现不能在变量中出现空格!所以奇怪是SECRET模块不能运作。
应用需要监听8080端口, “但我们推荐用端口环境变量 (process.env.PORT).”
部署
部署可以通过CLI来做,但你也可以压缩整个项目并把它通过他们很有趣的网络接口上传。我没有任何问题,部署,但每次要把你整个项目(除了node_modules之外)都打包和上传,这会使它的处理过程比那些使用 git 的“diff”功能或 rsync 的工具慢得多。
至于写作,模块运行于0.8.15版本,并忽略你在 package.json 中指定的任何内容。
其它注意事项和仪表板
我为这些家伙欢呼,并希望他们能继续改善。有个内置MongoDB的选项会是不错的,我喜欢前期定价。
###NextPage###
AppFog
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的选项。
Windows Azure
变量配置
变量可以通过网络接口或者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是唯一这么做的供应商。
dotCloud
支持多国语言.就像Nodejitsu一样, 他们最近取消了他们的免费服务,所以在开始使用之前需要绑定一张信用卡.
参数配置
参数的设置通过CLI或者一个dotcloud.yml文件设置.
监听端口需要设置为8080.
部署
dotClouds CLI使用Python编写的, 同时使用rsync在每次部署的时候最小化你要上传的数据. 为了帛书,你需要配置supervisord.conf和dotcloud.yml文件。
目前, dotCloud的版本为 0.6.20. Ouch.
注意事项和控制面板
早期的时候我感到非常的愤怒,当他们进行一些重大修改却几乎没有警告的时候。我猜这就是生活在一个beta的世界,但是我一直没有急着跑回来。
Engine Yard
就像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。
当我第一次部署失败,会弹出一个可以输入手机号的窗口。
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相关人员进行了沟通,他们也将更新入门指南让这部分内容更加得通俗易懂。
CloudFoundry
首先来看,CloudFoundry有一个明确、友好的入门过程。然而,几个屏幕之后,我得到了这个消息:
*我们正处在一个过渡时期:*
您正在阅读V2文档... Cloudfoundry.com在2013年6月将被升级到V2。
所以,我会转回到他们在这一系列的下一期中。
后会有期
不用说,这个世界正在迅速的变化着。不要把太多的关注放在任何具体的细节上,除非先检查更新。例如,在两天前我写好这篇文章,Modulus发送了一封邮件给我,有关升级版本的Node.js。
在以后的文章中,我将继续监控和测试这些平台的性能,然后记录扩展他们的快照。在此期间,如果我错过了你最喜欢的Node.js PaaS,请让我知道。
via http://www.oschina.net/translate/a-comparison-of-node-js-paas-hosting-providers