部署生产Node.js服务器

时间:2011-12-05 14:02:51

标签: javascript deployment node.js production-environment

我已经编写了一个Node.js应用程序,我希望它能在我们的一台生产机器上运行。这似乎是一个非常常见的请求,但我找不到合适的解决方案。是否没有用于部署生产Node.js应用程序的既定解决方案?

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

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

使用框架(例如Express)

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

使用nohup

启动服务器

这里的主要问题是异常处理,我们(显然)不希望整个服务器因异常而崩溃。根据我的理解,将整个应用程序包装在try {} catch {}循环中将无济于事,因为Javascript解释器在异常后处于不可预测的状态。这是对的吗?

使用类似Forever的内容

我在我们的FreeBSD机器上安装了Forever,这是非常错误的。它最终催生了无法从Forever中杀死的无尽进程。我必须运行kill -9来恢复我的机器,我对在Forever上运行生产应用程序感到不自信。似乎Upstart(类似的工具,但更通用)不能在FreeBSD上运行。

托管解决方案(例如Heroku,Rackspace,Amazon EC2等)

这可能是最简单的解决方案,但我们已经拥有了其他网络服务器的严肃硬件。出于财务考虑,它没有意义。

当然必须有一些既定的解决方案?我错过了什么吗?

6 个答案:

答案 0 :(得分:40)

  • 你真的应该使用一个框架(我建议使用Express,因为它经过了实战测试),除非你想自己处理会话,cookie,中间件等。快递真的很轻。
  • 使用nohup启动服务器:您不应该这样做,只需使用常规“node”命令启动它。 Express也将路由包装在try-catch中,因此您的服务器不会在路由中崩溃。但是,如果您的服务器确实存在严重问题,您不应该担心重新启动它(此外,如果您至少有2-3个进程,那么只有一个会死,所以剩下至少1-2个并且用户赢了'感觉到一件事。
  • 对于监控,我个人更喜欢操作系统级别的更多内容,例如UpstartMonit
  • 托管解决方案:既然你已经有了自己认真的硬件,就不需要在其他方面投入资金了。只需使用负载均衡器(可能是nginx或node-http-proxy)来代理内容。

答案 1 :(得分:15)

请参阅Hosting Node Apps

  

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

答案 2 :(得分:5)

我认为这里有三个问题。

问题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:让他们来处理它。

答案 3 :(得分:4)

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

PM2 Offical Link

How to set up a node js application for production using pm2

答案 4 :(得分:2)

您可能会在ServerFault上得到更好的答案,但有使用one user's experience heresupervisord说明。您将需要使用某种进程观察程序来保持node进程的活动,另一个常见的建议似乎是以某种方式反向代理到node进程的连接。我可能会投票给nginx(这样你就可以nginx处理你需要的日志记录,身份验证或任何其他更高级别的HTTP功能,而不是以某种方式将它们烘焙到节点中),但是上述文章在这里和那里的评论中提到haproxy可能更轻量级。您选择的反向代理可能很大程度上取决于您是否需要WebSocket支持。

我不确定节点是否还有“标准”工作流程;它不像Rails那样成熟,有很多方法可以让webapp保持运行。

答案 5 :(得分:0)

Cloudkick的人们为此写了一个很好的解决方案。它被称为Casthttp://cast-project.org/

在您的服务器和工作站上安装强制转换。您在服务器上启动强制转换代理,并让您的工作站与服务器强制转换实例签名。然后,您可以创建“捆绑包”,将它们上传到服务器,从中创建/升级/销毁以及启动/停止实例。 Cast会在崩溃时自动重启您的服务。您还可以远程拖动stdout / strerr以及获取正在运行的实例和PID#的列表,并从工作站管理您的实例/服务器(无需SSHing)。文档稍微过时,但结果值得一点点额外的工作。所有交互/命令都通过HTTPS和RESTful API进行。

在此之前,我正在用SCP / SSH手动进行所有升级。我们supervise正在努力。我们没有回头。