2013-02-08 45 views
3

,我一直在使用Node.jsSocket.io實時應用程序,我想利用它從本地測試階段與我們的一些用戶測試它。麻煩的是,如果我關閉ssh會話到我的服務器,它也會停止我開始使用的服務器node app.jsNode.js:優雅重啓和服務器正常運行時間,howto?

我曾考慮過使用nohup,,但我偶爾會遇到分段錯誤或其他隨機錯誤,導致服務器關閉。我需要1)知道什麼時候(以及希望爲什麼)我的服務器崩潰了,所以我都可以改進它以減少崩潰並確保重新啓動它。另外,我不能24/7全天醒來重新啓動服務器,所以有一些daemon會很可愛。

我發現通過NPM可forever,但它不是與節點的版本比0.8.x更近,我跑0.9.1兼容,它似乎並不像它就會被維護得很好。

我也偶然發現了distributionup,但使用它們構建體面的應用程序的文檔和示例似乎很缺乏。

然後有這個答案使用clusteros模塊。 https://stackoverflow.com/a/10997753/1883464

但節點列出集羣實驗http://nodejs.org/api/cluster.html

隨着真實的生產環境,我開始得不到答案,範例,並討論保持節點服務器正常運行(和更新他們的代碼!)感覺我是第一個想要將他們的應用程序部署的人;)不知何故,我確信對於我沒有找到的這個問題有一些常見的答案。

+1

看看我的答案http://stackoverflow.com/questions/14287429/what-is-the-current-best-practice-for-a-production-deployment-of-node-to-aws/ 14288820#14288820特別是關於'集羣'的可靠性的評論。 – 2013-02-08 16:14:26

+1

另外,請閱讀:http://gun.io/blog/tutorial-deploy-node-js-server-with-example/它使用monit monitore並重新啓動node.js應用程序,如果它崩潰。 – Kaeros 2013-02-08 16:16:09

+0

謝謝!@AaronDufour你的答案給了我更多的思考使用羣集方法。 – runspired 2013-02-08 16:23:49

回答

2

操作系統提供的init系統比任何Node.js模塊提供了許多優點。 掛鉤到init系統是確保您的應用在重新啓動後自動啓動的唯一方法。

我們使用Ubuntu和Upstart獲得了很多成功。 Upstart會在崩潰時重新啓動應用程序,並且可以在運行進程之前設置用戶標識/組。 不要以根目錄運行

寫入Upstart文件有點痛苦,我們使用Node Foreman自動生成並從我們的應用程序Procfile導出一組upstart文件。

npm i -g foreman 
cd MY_APP 
nf export -o /etc/init 

這將會把一系列暴發戶文件到/etc/init可以啓動,並與sudo start foremansudo stop foreman停止。

暴發戶不在這裏唯一的解決辦法,並且上述可適於根據需要,以適應其他操作系統。在Redhat上,我建議看看systemd。我不會推薦使用Mac OSX進行生產,但在捏它的時候有launchd

+0

關於「不能作爲根源運行」的推理是什麼?或者這種建議只適用於共享主機或VPM? – runspired 2013-02-08 17:10:21

+1

如果您的應用程序有任何漏洞,並且*所有*應用程序都有這些漏洞,則說明您的系統過度暴露。如果您需要綁定到端口80,請以root身份啓動,然後**使用'process.setuid(...)'放棄**您的權限。 – 2013-02-08 17:13:49

+0

請查閱http://savanne.be/articles/deploying-node-js-with-systemd/瞭解有關使用systemd部署Node.js的更多信息。 – 2013-06-17 08:31:16