部署生产Node.js服务器
我已经写了一个Node.js应用程序,我正在寻找它在我们的一台生产机器上运行。 这似乎是一个相当普遍的要求,但我找不到一个适当的解决scheme。 是否没有build立生产Node.js应用程序的解决scheme?
该应用程序很简单(<100 LOC),但需要非常高效,可靠,可连续运行多年,而无需重新启动。 它将在一个大型网站上运行,每秒钟几十个连接。 (该应用程序不被用作networking服务器,它只有一个JSON API)
以下是我考虑的方法,但我仍然不确定:
使用框架(如Express)
因为应用程序需要高性能,而且非常简单,所以以框架的forms添加膨胀是我想要避免的。
用nohup
启动服务器
这里的主要问题是exception处理,我们(显然)不希望整个服务器因为exception而崩溃。 据我所知,在一个try {} catch {}
循环中包装整个应用程序将无济于事,因为在解释exception之后,Javascript解释器处于不可预知的状态。 那是对的吗?
使用像永远的东西
我已经在我们的FreeBSD机器上安装了Forever,这是非常麻烦的。 它最终产生了无法从Forever中杀死的无尽进程。 我必须运行kill -9
来让我的机器重新运行,并且我对运行Forever上的生产应用程序没有太大的信心。 也似乎Upstart(类似的工具,但更通用)不会在FreeBSD上运行。
托pipe解决scheme(如Heroku,Rackspace,Amazon EC2等)
这可能是最简单的解决scheme,但我们已经有一个严重的硬件,我们的networking服务器的其余部分。 出于财务考虑,这是没有道理的。
一定有一些确定的解决scheme呢? 我错过了什么吗?
- 除非你想自己处理会话,cookies,中间件等,否则你真的应该使用一个框架(我推荐一些类似于Express的东西)。 快车真的很轻。
- 用nohup启动服务器:你不应该这样做,只要用普通的“node”命令启动就可以了。 也快速包装路线的尝试赶上,所以你的服务器不会崩溃的路线。 但是,如果你的服务器有严重的问题,你不应该担心重新启动它(另外,如果你至less有2-3个进程,只有一个会死掉,所以至less有1-2个进程,没有感觉到的东西)。
- 为了进行监控,我个人更喜欢操作系统级别的东西,比如Upstart和Monit 。
- 主机解决scheme:因为你已经有了自己认真的硬件,所以不需要投资其他的东西。 只需使用负载平衡器(也许nginx或节点http代理)来代理的东西。
请参阅主机节点应用程序 。
本教程将引导您设置一个可以为服务器端JavaScript应用程序托pipenode.js应用程序的服务器。 现在,node.js托pipe选项归结为运行与Web服务器交谈的节点守护进程。 大多数Web服务器可以代理连接到不同的端口,所以你可以使用Apache或Nginx来做到这一点。
我想这里有三个问题。
问题0:“我应该为我的节点应用程序使用框架吗?
问题1:“如何在生产机器上运行节点服务器?
问题2:“如何将节点应用程序部署到生产”。
对于问题1 ,我真的很喜欢群集 (尽pipe最新的Node版本有类似内置的东西,所以你可以检查一下)。 我曾经用Monit / Upstart来监视操作系统级别的事件,并确保你的服务器状态良好。 (这是监视Ruby瘦服务器的N个集群,但同样的事情)。
根据您希望在多台计算机上运行群集的stream量,然后在其前面放置负载平衡器。 这取决于您的stream量,请求完成的时间长度/阻塞事件循环的时间以及每台计算机启动多less个处理器/节点实例。
框架为您提供更好的error handling,并捕获将会退出正常的node.js应用程序的错误。 如果你没有框架的话,确保你阅读了node.js中的error handling。
对于问题2 ,我不认为节点社区还有很好的部署标准。 您可以尝试使用Ruby的Capistrano工具(以下是一个关于使用Capinstrano部署集群的博客文章 )。
Capistrano的坏处在于它使得一些假设可能不是真实的(即:你正在部署一个Rails项目),所以你最终可能会与框架争斗。
我的goto部署解决scheme通常是Python的Fabric工具,它为您提供部署工具,并让您可以执行您所需要的工作。
另一个部署选项是“云”,像Nodester的东西:让他们照顾它。
尝试使用pm2它是简单和直观的CLI,可通过NPM安装。 只需启动您的应用程序与PM2和您的应用程序已准备好处理大量的stream量
PM2官方链接
如何使用pm2build立节点js应用程序进行生产
您可能会在ServerFault上得到更好的答案,但是在这里使用supervisord
描述了一个用户的体验 。 您将需要使用某种stream程监视器来保持node
进程的活跃,另一个常见build议似乎是以某种方式反向代理到node
进程的连接。 我可能会投票nginx
(这样你可以让nginx
处理日志logging,身份validation,或任何其他更高级别的HTTPfunction,而不是将它们烘焙到节点),但上述文章提到haproxy
在这里的评论那里可能会更轻。 您select的反向代理可能很大程度上取决于您是否需要WebSocket支持。
我不确定节点是否还有更多的“标准”工作stream程存在; 它不像Rails那样有很多方法可以让webapp运行。
Cloudkick的人写了一个很好的解决scheme。 这就是所谓的Cast
, http://cast-project.org/ 。
在您的服务器和工作站上安装强制转换。 您在服务器上启动cast-agent并让您的工作站使用服务器cast实例签名。 然后,您可以创build“捆绑”,将其上传到服务器,创build/升级/销毁它们以及启动/停止您的实例。 演员将在崩溃时自动重启您的服务。 您也可以远程执行stdout / strerr,并获取正在运行的实例和PID#的列表,并从工作站pipe理您的实例/服务器(不需要SSH)。 文档稍微过时了,但是结果是值得的额外工作的一点点。 所有的交互/命令都通过HTTPS和RESTful API。
在此之前,我正在用SCP / SSH手动进行所有升级。 我们有supervise
保持。 我们还没有回头。