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
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頁面,並且能夠將項目的所有權轉讓給不同的使用者。
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的選項會是不錯的,我喜歡前期定價。
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的選項。
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是唯一這麼做的供應商。
dotCloud
http://dotcloud.com
支援多國語言.就像Nodejitsu一樣, 他們最近取消了他們的免費服務,所以在開始使用之前需要綁定一張信用卡.
參數配置
參數的設定通過CLI或者一個dotcloud.yml檔案設定.
監聽連接埠需要設定為8080.
部署
dotClouds CLI使用Python編寫的, 同時使用rsync在每次部署的時候最小化你要上傳的資料. 為了帛書,你需要配置supervisord.conf和dotcloud.yml檔案。
目前, dotCloud的版本為 0.6.20. Ouch.
注意事項和控制台
早期的時候我感到非常的憤怒,當他們進行一些重大修改卻幾乎沒有警告的時候。我猜這就是生活在一個beta的世界,但是我一直沒有急著跑回來。
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。
當我第一次部署失敗,會彈出一個可以輸入手機號的視窗。
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相關人員進行了溝通,他們也將更新入門指南讓這部分內容更加得通俗易懂。
CloudFoundry
http://cloudfoundry.com
首先來看,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