NodeJS生产部署最佳实践

时间:2014-02-20 08:25:22

标签: node.js git deployment ansible

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

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

我考虑过以下几个选项但是想知道是否有一些我忽视的东西:

  1. TGZ
  2. CI环境将从已通过单元测试和集成测试的项目构建tarball。可选地,可以捆绑depednencies(无需在生产计算机上运行npm install并依赖于公共或私有npm存储库的网络连接)。

    我的主要问题是依赖于系统库的任何依赖项都将构建在不同的机器上(尽管是相同的图像)。我不喜欢这个。

    1. NPM
    2. CI环境将发布到私有NPM存储库,Ansible部署脚本将在配置后签出特定版本。同样,当您要部署时,这会依赖于可用的外部服务。我不喜欢这个。

      1. GIT中
      2. 任何依赖于系统的模块都将作为配置的一部分进行全局安装,并且所有其他依赖项都将检入存储库。这使我能够灵活地进行差异部署,从而只需推送增量,并且流程管理器几乎可以立即自动重启应用程序守护程序。然后绝对锁定依赖关系。

        这意味着除非进行扩展,否则无需启动新VM。部署可以直接推送到所有活动实例。

1 个答案:

答案 0 :(得分:1)

首先,无论部署方法如何,您都需要确保在部署新代码时不要删除请求。一种简单的方法是在切换之前从负载均衡器中删除节点。在此之前,您可能还想尝试评估是否存在待处理请求,打开连接或因过早终止而受到负面影响的任何其他内容。或者像up模块那样。

大多数人不会建议源控制您的模块。您node_modules使用npm install声明时bundledDependencies已填写package.json的{​​。}}似乎.tgz可能会涵盖您的所有问题。使用此方法,节点上的npm install将无法再次下载和安装所有内容。但是,它将重建可能涵盖系统库问题的节点gyp实现。

您还可以使用git标签更轻松地跟踪具有特定依赖关系和有效负载的版本。手动部署代码可能会变得乏味,您可能需要考虑自动执行例程,同时从接口迭代数据库中的x个已知服务器条目。 docker.io可能会引起关注。