Node.js设置用于简化部署和更新
Node.js设置用于简化部署和更新
我们目前正在为一位客户开发一个网站(在Apache下使用TYPO3),该网站由一个node.js/socket.io应用程序支持,该应用程序为从CMS提供的内容提供实时更新。
由于这是我们的第一个node.js项目,所以在建立'完美设置'时我没有任何最佳实践可依循,因此我花了一些时间研究部署技术。
为了实现一个良好的设置,还有一些问题需要解决:
1. 对于客户来说,部署应该很简单。这非常重要,因为我们的网站将集成到他们的'实时' TYPO3 安装中,该安装提供了大量的网站,并且运行在由另一个(集中式)组织管理的服务器上,这使得支持调用和服务器更改的过程变得缓慢。
2. 应该很容易更新。正如我之前提到的,请求重启和进行服务器更改是一个缓慢的过程,因此理想情况下,当通过git推送的更改被推送到实时安装时,node安装应该重新启动/更新。
部署
普遍共识似乎是使用'forever'来部署node应用程序以保持其运行。我已经测试了'forever',在使用'npm install forever -g'(全局)安装后,它似乎工作正常。然而,在实时环境中全局安装需要外部帮助,所以我更倾向于从应用程序的'node_modules'目录中运行。但是,我还没有找到一个可靠的封装来实现这一点。
此外,'forever'工作正常,但必须手动启动。保证它在服务器启动时启动并保持运行的最佳方法是什么?
- 一个简单的'init.d'脚本?
- 编写一个看门狗封装?
- 一个检查'forever'状态的TYPO3计划任务?
快速开发/更新时重启
我们目前仍处于项目的开发阶段,每次我对node.js应用程序进行更改时,我都会手动重启'node'或'forever'。虽然这样可以工作,但远非理想。
有几个较小的'npm'模块可以检查文件修改并在检测到更改后重新启动'node',例如:
- Nodemon
- Node.js Supervisor
- Bounce
- Nodules(不需要重新启动node,所以可能更容易与'forever'结合)
- Up
有没有人对其中任何一个有经验?
更新:为什么不使用Cluster?
Cluster模块通过reload机制提供类似的功能,但不适用于Node 0.5+。替换它的核心Cluster模块(Node 0.6+)只提供集群功能,并不具备所有这些功能。而且它与socket.io不兼容。至少没有使用Redis(对我们来说是一个问题,因为我们不能强制要求客户使用另一个先决条件服务)。
显然,我正在努力找到在将项目交给客户之前,结合更新重启和'forever'的最稳定的解决方案,我真的希望有人能提供经过验证的技术组合。
Node.js setup for easy deployment and updating
在生产环境中,你可能更好地选择像Cluster这样的工具。你可能不需要集群功能,但它也包括其他生产功能,如零停机重启、日志记录、工作进程等。
正如你所说,Forever对于测试来说还可以,但在生产环境中并不具备必要的功能。
我好像模糊地记得,Cluster或类似的东西可能会在v0.7中被纳入Node本身。
听起来这似乎是完美的解决方案,但不幸的是它行不通。Node 0.6+版本附带的核心集群模块非常简单,没有我们实际感兴趣的所有高级功能。此外,旧模块与Node 0.5+版本不兼容。太糟糕了,这不会成为解决方案。非常感谢你的建议!
糟糕!抱歉,我还没有在生产环境中使用过Node.js,所以我错过了这一点。我还没有完全投入Node.js的原因之一是它明显的不成熟。希望0.7版本能在一定程度上解决这个问题,但也需要填补文档方面的巨大不足。
问题的原因是需要在Node.js中进行简单的部署和更新操作。现有的链接提供了一些帮助,但没有找到完美的答案。以下是一些相关链接:
- [https://serverfault.com/questions/274857/how-to-use-node-js-as-a-production-web-server](https://serverfault.com/questions/274857/how-to-use-node-js-as-a-production-web-server)
- [http://www.slideshare.net/the_undefined/nodejs-best-practices-10428790](http://www.slideshare.net/the_undefined/nodejs-best-practices-10428790)(查看第35张幻灯片)
- [http://www.slideshare.net/the_undefined/nodejs-in-production](http://www.slideshare.net/the_undefined/nodejs-in-production)(从第31张幻灯片到最后)
- [https://stackoverflow.com/questions/5668126](https://stackoverflow.com/questions/5668126)
虽然没有找到完美的答案,但有很多人正在运行生产环境的Node实例。希望这些链接能指引你朝着正确的方向前进。
非常感谢你在解决问题上的努力!你提供的第一个链接帮助我找到了最终采用的upstart
解决方案(请查看我的回答以获取综合解决方案)。非常感谢你的研究!
没关系,很抱歉我不能给出更直接的答案。不过请确保将你自己的回答标记为答案,这是鼓励的做法,也是完全可以接受的。
Node.js设置易于部署和更新的问题出现的原因是希望能够自动重启脚本出现错误和自动重新加载脚本更改。解决方法是使用forever来处理自动重启和重新加载,并且通过upstart在系统启动时启动脚本。
首先,需要添加一个server.js脚本来启动要运行的app.js脚本,并且使用forever来监视文件的更改并在文件更改后重新启动脚本。
然后,需要创建.foreverignore文件来忽略日志和pidfile的文件监视,否则脚本将循环重启。
最后,使用Upstart来在系统启动时启动脚本,并且可以使用start和stop命令来轻松控制服务。
需要注意的是,不建议以root身份运行node,因此在新服务器上将使用sudo -u www-data /usr/local/bin/node来启动node。
通过这样的设置,可以让forever自动启动,并通过node server.js启动,同时监视崩溃和文件更改,保持整个设置运行。
这个方法对于一些人很有帮助,但也有一些用户在使用Amazon Linux的Upstart时遇到了问题,需要移除expect fork这一行代码来解决。
参考链接:[nodejs and forever monitoring and restarting app](http://stackoverflow.com/questions/15639828)