我写了一个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等)
这可能是最简单的解决方案,但我们已经为其余的Web服务器提供了一个严肃的硬件.出于财务考虑,它没有意义.
当然必须有一些既定的解决方案吗?我错过了什么吗?
你真的应该使用一个框架(我推荐像Express这样的东西,因为它经过了实战测试),除非你想自己处理会话,cookie,中间件等.快递很轻松.
使用nohup启动服务器:您不应该这样做,只需使用常规"node"命令启动它.Express也将路由包装在try-catch中,因此您的服务器不会在路由中崩溃.但是,如果您的服务器确实存在严重问题,您不应该担心重新启动它(此外,如果您至少有2-3个进程,那么只有一个会死,所以剩下至少1-2个并且用户赢了'感觉到一件事.
对于监控,我个人更喜欢操作系统级别的东西,如Upstart和Monit.
托管解决方案:既然你已经拥有了自己认真的硬件,就不需要在其他方面投入资金.只需使用负载均衡器(可能是nginx或node-http-proxy)来代理内容.
请参阅主机节点应用程序.
本教程将指导您设置可以为服务器端JavaScript应用程序托管node.js应用程序的服务器.现在,node.js托管选项可以归结为运行与Web服务器通信的节点守护程序进程.大多数Web服务器可以代理到不同端口的连接,因此您将能够使用Apache或nginx来执行此操作.
我想这里有三个问题.
问题0:"我应该为我的节点应用程序使用框架吗?"
问题1:"如何在生产计算机上运行节点服务器?"
问题2:"如何将节点应用程序部署到生产中".
对于问题1,我真的很喜欢Cluster(虽然最新的Node版本有内置的类型,所以你可以检查一下).我在Monit/Upstart这样的东西上取得了很好的成功,可以监控操作系统级别的事件并确保您的服务器运行状况良好.(这是监视N个Ruby瘦服务器集群,但同样的事情).
根据您可能希望在多台计算机上运行群集的流量,然后将负载均衡器放在其前面.这取决于您的流量,请求完成的时间/阻止事件循环的时间以及每台计算机启动的处理器/节点实例数.
框架为您提供更好的错误处理,并捕获可能会退出正常node.js应用程序的错误.如果在没有框架的情况下执行此操作,请确保阅读node.js中的错误处理.
对于问题2,我认为节点社区还没有一个好的部署标准.您可以尝试使用Ruby的Capistrano工具(这里是一篇关于使用Capinstrano部署集群的博客文章).
关于Capistrano的坏处是,它做出了一些可能不正确的假设(即:你正在部署一个Rails项目),所以你最终可能会对框架进行大量的战斗.
我的goto部署解决方案通常是Python的Fabric工具,它为您提供部署工具,让您可以执行您需要执行的操作.
另一个部署选项是"云",像Nodester这样的东西:让他们来处理它.
尝试使用pm2,它是简单直观的CLI,可通过NPM安装。只需使用PM2启动您的应用程序,您的应用程序即可处理大量流量
PM2官方链接
如何使用PM2设置Node JS应用程序以进行生产