【问题标题】:Node.js : graceful restarts and server uptime, howto?Node.js:优雅重启和服务器正常运行时间,如何?
【发布时间】:2013-01-24 10:56:42
【问题描述】:

我一直在使用Node.jsSocket.io 开发一个实时应用程序,我想将它从本地测试阶段带到我们的一些用户进行测试。问题是,如果我关闭到我的服务器的 ssh 会话,它也会停止我开始使用的服务器 node app.js

我考虑过使用nohup,,但我偶尔会遇到分段错误或其他导致服务器停机的随机错误。我需要 1) 知道我的服务器何时(希望是为什么)崩溃,这样我就可以努力改进它以减少崩溃并确保它重新启动。此外,我不能 24/7 保持清醒自己重新启动服务器,所以拥有某种 daemon 会很可爱。

我发现 forever 可通过 npm 获得,但它与比 0.8.x 更新的 Node 版本不兼容,而且我正在运行 0.9.1,而且它似乎没有得到很好的维护。

我也偶然发现了 distributionup,但似乎缺乏使用它们构建体面应用的文档和示例。

然后使用clusteros 模块得到这个答案。 https://stackoverflow.com/a/10997753/1883464

但 Node 将集群列为实验性 http://nodejs.org/api/cluster.html

由于缺乏关于在真实生产环境中保持 Node 服务器正常运行(以及更新其代码!)的答案、示例和讨论,我开始觉得我是第一个想要使用他们的服务器的人应用到部署 ;) 不知何故,我确信这个问题有一些我没有找到的常见答案。

【问题讨论】:

  • 看看我对stackoverflow.com/questions/14287429/… 的回答,特别是关于cluster 可靠性的cmets。
  • 另外,请阅读:gun.io/blog/tutorial-deploy-node-js-server-with-example 它使用 monit 监控并在 node.js 应用程序崩溃时重新启动。
  • 谢谢! @AaronDufour 你的回答让我对使用集群方法有了更多的了解。
  • @Kaeros 如果集群方法效果不佳,我会尝试使用 Monit。认为我喜欢集群提供的负载平衡潜力。
  • 您使用什么操作系统?您应该使用操作系统提供的初始化系统。我们使用 Ubuntu 和 Upstart。效果很好。

标签: javascript node.js socket.io


【解决方案1】:

操作系统提供的初始化系统提供了许多优于任何 Node.js 模块的优势。 连接到初始化系统是确保您的应用在重新启动后自动启动的唯一方法。

我们使用 Ubuntu 和 Upstart 取得了很大的成功。 Upstart 将在崩溃时重新启动您的应用程序,并且可以在运行您的进程之前设置用户 ID/组。 不要以 Root 身份运行

编写 Upstart 文件有点痛苦,我们使用 Node Foreman 自动从我们的应用程序 Procfile 生成和导出一组 upstart 文件。

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

这会将一组新贵文件放入/etc/init,可以使用sudo start foremansudo stop foreman 启动和停止。

Upstart 不是这里唯一的解决方案,上面可以根据需要进行调整以适应其他操作系统。在 Redhat 上,我建议查看 systemd。我不推荐使用 Mac OSX 进行生产,但在紧要关头它有 launchd

【讨论】:

  • “不要以 Root 身份运行”的原因是什么。还是该建议仅适用于共享主机或 VPM?
  • 如果您的应用程序有任何漏洞,并且所有应用程序都有这些漏洞,那么您的系统暴露过度了。如果您需要绑定到端口 80,请以 root 身份启动,然后使用process.setuid(...)删除您的权限。
  • 查看savanne.be/articles/deploying-node-js-with-systemd 了解有关使用 systemd 部署 Node.js 的更多信息。
猜你喜欢
  • 2012-02-14
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多