2013-02-08 44 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