NodeJS生产部署最佳实践

我正在寻找以一致和及时的方式将一些Web服务部署到生产环境中的方法。

我目前正在实施一个部署pipe道,该pipe道将以一个特定版本的软件的手动部署操作结束到由Ansible提供的许多虚拟机。 这个想法是使用版本Aconfigurationx个实例,同时已经有y个运行版本B的实例。然后映射并轻拂stream量。 同样的机制应该允许我使用我已经创build的映像在一个集合中扩展新的vms。

我已经考虑了以下选项,但是想知道是否有我忽略的东西:

  1. TGZ

CI环境将从已通过unit testing和集成testing的项目中构build一个tarball。 可选的是,将会捆绑(取消在生产计算机上运行npm install并依赖到公共或专用npm存储库的networking连接)的需求。

我的主要问题是依赖于系统库的任何依赖关系将build立在不同的机器上(尽pipe是相同的图像)。 我不喜欢这个。

  1. NPM

CI环境将发布到私有NPM存储库,并且在configuration之后,Ansible部署脚本将检出特定的版本。 当您想要部署时,这又会受到对外部服务的依赖。 我不喜欢这个。

  1. 混帐

任何依赖于系统的模块都将作为供应的一部分进行全局安装,并将所有其他依赖项都检入到资源库中。 这使我能够灵活地进行差异化部署,只需推动增量,应用程序守护进程几乎可以立即由进程pipe理器自动重新启动。 依赖关系然后被绝对locking。

这意味着,除非缩放,否则不需要旋转新的虚拟机。 部署可以直接推送到所有活动的实例。

首先,无论部署方法如何,您都需要确保在部署新代码时不要删除请求。 一种简单的方法是在切换之前从负载平衡器中删除节点。 在这样做之前,您可能还想尝试评估是否存在未决请求,打开的连接或任何由于提前终止而受到负面影响的情况。 或者可能是类似的up模块。

大多数人不会推荐你的模块来源控制。 看起来你的node_modules已经在npm install填充了一个.tgz,而在你的package.json使用bundledDependencies声明可能会覆盖你的所有问题。 使用这种方法,节点上的npm install将不会再次下载并安装所有内容。 虽然,它会重build节点gyp实现,可能会涵盖您的系统库的关注。

你也可以使用git标签来更容易地跟踪具有特定依赖和有效载荷的版本。 手动部署代码可能非常乏味,您可能需要考虑自动化例程,同时从接口迭代数据库中已知的x个已知服务器条目。 docker.io可能是有趣的。

Interesting Posts