部署产品 Node.js 服务器

我已经写了一个 Node.js 应用程序,我希望它能在我们的一台生产机器上运行。这似乎是一个相当普遍的要求,但我无法找到一个适当的解决方案。是否有既定的解决方案来部署产品 Node.js 应用程序?

该应用程序是简单的(< 100 LOC) ,但需要非常有效,可靠,可以连续运行多年不重新启动。它将在一个大型网站上运行,每秒有几十个连接。(该应用程序不作为一个网络服务器使用,它只有一个 JSON API)

以下是我考虑过的方法,但我仍不确定:

使用框架(例如 Express)

因为这个应用程序需要高性能并且非常简单,所以我希望避免以框架的形式添加膨胀。

nohup启动服务器

这里的主要问题是异常处理,我们(显然)不希望整个服务器因为异常而崩溃。据我所知,将整个应用程序包装在 try {} catch {}循环中是没有用的,因为在发生异常之后,Javascript 解释器会处于一种不可预测的状态。是这样吗?

使用“永远”这样的东西

我已经在我们的 FreeBSD 机器上安装了 Forever,它非常漏洞百出。它最终产生了无穷无尽的进程,而这些进程是永远也杀不死的。我必须运行 kill -9才能拿回我的机器,而且我对在 Forever 上运行一个生产应用程序不是很有信心。Upstart (类似的工具,但更通用)似乎也不能在 FreeBSD 上运行。

托管解决方案(如 Heroku、 Rackspace、 AmazonEC2等)

这可能是最简单的解决方案,但是我们已经为其余的 Web 服务器提供了一个严肃的硬件。从经济角度考虑,这说不通。

肯定有什么既定的解决方案吧? 我是不是漏掉了什么?

61167 次浏览

您可能会在 ServerFault 上得到更好的答案,但是有一个使用 supervisord一个用户的经验描述。您将需要使用某种进程监视器来保持 node进程活动,另一个常见的建议似乎是以某种方式反向代理连接到 node进程。我可能会投票支持 nginx(这样你就可以让 nginx处理日志记录、身份验证或者任何其他你需要的更高级的 HTTP 特性,而不是以某种方式把它们烘烤成节点) ,但是前面提到的文章在各处的评论中提到了 haproxy,它可能更轻量级。您对反向代理的选择很大程度上取决于您是否需要 WebSocket 支持。

我不确定是否还有更多的“标准”工作流存在于 node 之中; 它还没有像 Rails 这样有无数种方法来保持 Web 应用程序运行的工具那么成熟。

参见 托管节点应用程序

本教程将引导您设置一个服务器,该服务器可以为服务器端 JavaScript 应用程序托管 node.js 应用程序。现在,node.js 托管选项归结为运行与 Web 服务器通信的节点守护进程。大多数 Web 服务器可以代理连接到不同的端口,因此您可以使用 Apache 或 nginx 来实现这一点。

  • 你真的应该使用一个框架(我推荐使用 Express 这样的框架,因为它经过了实战测试) ,除非你想自己处理会话、 cookie、中间件等等。快车真的很轻。
  • 使用 nohup 启动服务器: 您不应该这样做,只需使用常规的“ node”命令启动服务器。Express 还将路由包装在 try-catch 中,这样您的服务器就不会在路由中崩溃。然而,如果你的服务器确实有严重的问题,你不应该害怕重新启动它(此外,如果你至少有2-3个进程,只有一个会死亡,所以将至少有1-2剩余,用户不会有任何感觉)。
  • 对于监视,我个人更喜欢 OS 级别的东西,比如 暴发户Monit
  • 托管解决方案: 既然您已经有了自己的硬件,就不需要在其他方面投资。只需要使用一个负载平衡器(可能是 nginx 或 node-http-xy)来代理东西。

我想这里有三个问题。

问题0: “我应该为我的节点应用程序使用一个框架吗?”

问题1: “如何在生产计算机上运行节点服务器?”

问题2: “如何将节点应用程序部署到生产环境”。

对于 问题1,我非常喜欢 群组(尽管最新的 Node 版本内置了类似的东西,所以您可以查看一下)。我在 Monit/Upstart 之类的东西上取得了很大的成功,它们可以监视操作系统级别的事件,并确保您的服务器处于良好的状态。(这是监视 Ruby Thin 服务器的 N 个集群,但是同样的事情)。

根据流量的不同,您可能希望在多台机器上运行集群,然后在集群前面放置一个负载平衡器。这取决于流量、请求完成所需的时间/阻塞事件循环的时间,以及每台机器启动多少处理器/节点实例。

框架为您提供了更好的错误处理,并捕获可能退出正常 node.js 应用程序的错误。如果没有框架,请确保阅读 node.js 中的错误处理。

对于 问题2,我认为节点社区还没有一个好的部署标准。您可以尝试使用 Ruby 的 Capistrano 工具(这里是 关于使用 Capstrano 部署集群的博客条目)。

Capistrano 的缺点是它做了一些可能不正确的假设(例如: 您正在部署一个 Rails 项目) ,因此最终可能会与框架发生很多冲突。

我的 goto 部署解决方案通常是 Python 的 布料工具,它为您提供了部署工具,并允许您做需要做的事情。

另一个部署选项是“云”,使用像 Nodester这样的东西: 让他们来处理它。

Cloudkick 的人写了一个很棒的解决方案,叫做 Casthttp://cast-project.org/

在服务器和工作站上安装强制转换。您在服务器上启动强制转换代理,并使您的工作站与服务器强制转换实例签名。然后,您可以创建“ bundle”,将它们上传到服务器,从它们创建/升级/销毁,以及启动/停止实例。当服务崩溃时,Cast 将自动重新启动您的服务。您还可以远程跟踪 stdout/strerr,获取正在运行的实例和 PID # 的列表,并从工作站管理您的实例/服务器(不需要 SSHing)。这些文档有点过时了,但是这些结果值得我们做一点额外的工作。所有的交互/命令都是通过 HTTPS 和 RESTful API 实现的。

在此之前,我使用 SCP/SSH 手动完成所有升级。我们有 supervise保持联系。我们没有回头。

尝试使用 pm2它是简单直观的 CLI,可以通过 NPM 安装。只要使用 PM2启动应用程序,应用程序就可以处理大量的流量

PM2官方连结

如何使用 pm2设置用于生产的节点 js 应用程序