2011-12-05 110 views
74

我寫了一個Node.js的應用程序,我希望把它在我們的生產機器的一個運行。這似乎是一個相當普遍的要求,但我找不到一個合適的解決方案。是否沒有建立生產Node.js應用程序的解決方案?部署生產的Node.js服務器

該應用程序很簡單(< 100 LOC),但需要非常高效,可靠並且可以連續運行多年而無需重新啓動。它將在大型網站上運行,每秒連接數十個。 (該應用程序無法用作網絡服務器,它只有一個JSON API)

這裏是我考慮的方法,但我仍然不能確定。

使用框架(如快遞)

由於該應用程序需要高性能且非常簡單,因此添加框架形式的膨脹是我想避免的。

開始與nohup

這裏的主要問題的服務器是異常處理,我們(顯然)不希望整個服務器,因爲異常的崩潰。據我瞭解,環繞整個應用程序在try {} catch {}循環將沒有幫助,因爲JavaScript解釋器是一個例外後留在不可預知的狀態。那是對的嗎?

使用像永遠

我永遠裝在我們的FreeBSD機器,這是非常錯誤。它最終產生了無法從Forever中殺死的無盡進程。我必須運行kill -9才能讓我的機器恢復正常,並且我對Forever上運行的生產應用程序沒有太大的信心。似乎Upstart(類似的工具,但更通用)不能在FreeBSD上運行。

託管解決方案(例如Heroku的,Rackspace公司,亞馬遜EC2等)

這可能是最簡單的解決方案,但我們已經爲我們的Web服務器的其餘部分嚴重的硬件。出於財務考慮,這是沒有意義的。

當然必須有一些既定的解決方案呢?我錯過了什麼嗎?

+0

暴發戶是在FreeBSD sysvinit的替代品。 – chovy

+3

2014年閱讀這份SO的人羣。 「永遠」不應該被打折,因爲在這種情況下,它在兩年多的時間裏失敗了很多次。過去幾個月我已經成功運行它。 –

+6

對於2015年閱讀這份SO的人羣。只要使用[PM2(http://www.nikola-breznjak.com/blog/nodejs/using-pm2-to-run-your-node-js-apps-like-a-pro/),而不是永遠。 – Nikola

回答

38
  • 你真的應該真正使用的框架(我建議像快,因爲它是久經考驗的),除非你要處理的會話,餅乾,中間件等自己。 Express很輕。
  • 開始用nohup的服務器:你不應該這樣做,只是普通的「節點」命令來啓動它。此外,Express將路由包裝在try-catch中,因此您的服務器不會在路由中崩潰。但是,如果你的服務器確實有一個嚴重的問題,您應該不怕重新啓動它(此外,如果您有2-3個過程至少,只有一管就死,所以會有至少1-2剩餘和在用戶中贏得」不會感覺到什麼)。
  • 對於監控,我個人比較喜歡在操作系統級別更多的東西,例如UpstartMonit
  • 託管解決方案:既然你已經有了自己的嚴重的硬件的東西,沒有必要在別的錢投資。只需使用負載平衡器(可能是nginx或node-http-proxy)來代理東西。
2

您可能會在ServerFault上得到更好的答案,但有一個使用supervisordone user's experience here的說明。你會需要使用某種過程守望者保持node過程活着,而另一種常見的建議,似乎是反向代理的node過程連接莫名其妙。我可能會爲nginx投票(這樣你可以用nginx來處理日誌,身份驗證或者你需要的任何其他更高級別的HTTP功能,而不是將它們烘焙成節點),但是前面提到的文章在這裏的評論中提到了haproxy那裏可能更輕。您選擇的反向代理可能很大程度上取決於您是否需要WebSocket支持。

我不確定節點剛剛存在多少「標準」工作流程;它不像Rails那樣有很多方法可以讓webapp運行。

15

請參閱Hosting Node Apps

本教程將引導您設置一個服務器,該服務器可以承載服務器端JavaScript應用程序的node.js應用程序。現在,node.js託管選項歸結爲運行與Web服務器交談的節點守護進程。大多數Web服務器可以代理連接到不同的端口,所以你可以使用Apache或Nginx來做到這一點。

+2

鏈接已損壞。 –

4

這裏有三個問題,我想。

問題0:「我應該爲我的節點應用程序使用框架嗎?」

問題1:「我怎麼生產的機器上運行節點服務器?」

問題2:「我如何部署節點應用到生產」。

對於問題1,我真的很喜歡Cluster(儘管最新的Node版本有類似內置的東西,所以你可以檢查一下)。我曾經使用過Monit/Upstart等軟件來監控操作系統級別的事件,並確保您的服務器狀態良好。 (這是監視N個Ruby瘦服務器羣集,但是同樣的事情)。

根據您希望在多臺機器上運行集羣的流量,然後將負載平衡器放在其前面。這取決於您的流量,請求完成的時間長度/阻塞事件循環的時間以及每臺計算機啓動多少個處理器/節點實例。

框架爲您提供更好的錯誤處理,並捕獲將退出正常node.js應用程序的錯誤。如果你在沒有框架的情況下執行它,請確保閱讀了node.js中的錯誤處理。

對於問題2,我認爲節點社區還沒有很好的部署標準。你可以嘗試使用Ruby的Capistrano的工具(和這裏的a blog entry talking about deploying cluster with Capinstrano)。

Capistrano的壞處在於它使得一些假設可能不正確(即:你正在部署一個Rails項目),所以你最終可能會與框架爭鬥。

我的goto部署解決方案通常是Python的Fabric工具,它爲您提供了部署工具,並可讓您執行所需的工作。

另一個部署選項是「雲計算」,用之類的東西Nodester:讓他們照顧它。

0

在Cloudkick的傢伙寫了一個很好的解決了這一點。它叫做Cast,http://cast-project.org/

您的服務器和工作站上安裝演員。您在服務器上啓動演員代理並讓您的工作站使用服務器演員實例簽名。然後,您可以創建「捆綁」,將它們上傳到服務器,從它們創建/升級/銷燬以及啓動/停止您的實例。演員陣容在崩潰時會自動重啓您的服務。您還可以遠程執行stdout/strerr以及獲取正在運行的實例和PID#的列表,並從工作站管理您的實例/服務器(不需要SSH)。文檔稍微過時了,但結果值得一點額外的工作。所有的交互/命令都通過HTTPS和RESTful API。

在此之前,我與SCP/SSH手做所有的升級。我們有supervise保持。我們沒有回頭。

+1

Jim死了!該網站現在充滿了seo-garbage,Google沒有發現任何有趣的「node.js cast」 – Sergey

+0

是的,它已經放棄了。我們正在維護一個內部版本atm。回購可以在https://github.com/cloudkick/cast找到 –

相關問題