【问题标题】:Provide Node.JS webapp "key in hand"提供Node.JS webapp“钥匙在手”
【发布时间】:2012-12-14 14:12:54
【问题描述】:

我正在为客户端构建一个简单的 Node.JS 应用程序。 webapp 应该易于部署在每个服务器实例(即 RedHat EL 6.3)上,“关键在手”。

打包 Node.JS 应用程序的最佳方式是什么?基本上,我需要一个“安装程序”或“软件包”来:

  • 安装 Node.JS
  • 安装依赖(npm install)
  • 填充应用程序文件(CSS、JS、HTML 等)

【问题讨论】:

    标签: linux node.js web-applications packaging


    【解决方案1】:

    您应该提供一个独立的包裹。请查看伟大的网站The Twelve-Factor App,特别是build, release, run 部分。该网站体现了许多经验丰富的运营工程师来之不易的智慧。

    • 在您应用的存储库中,编写一个可以生成可分发存档的脚本(shell、节点等)
    • RPM 或 tar 存档是您最明智的 2 个选择。 tar 更便携、更简单。 RPM 可以很好地与基于 RPM 的发行版集成。如果您没有做很多软件打包/管理工作,我建议您从 tar 开始。 RPM 比 tar 复杂得多。
    • tar 存档应在其中嵌入 node.js 文件。这将使您的应用程序易于安装,并避免共享系统范围的节点安装,从而造成人为耦合。如果你走 RPM 路线,你可以在你的 RPM 规范文件中指定 node 作为依赖项(但你可能不应该 - 见下文)。
    • 存档也应该嵌入所有的 npm 依赖项。不要在安装包时运行npm install。考虑在开发期间使用npm shrinkwrap 工具来管理您的依赖项,但在部署时它们应该预先捆绑并准备好运行。

    具体来说,这些是你应该避免的坏主意:

    • 在安装过程中不要从 Internet 下载任何内容。这是脆弱、缓慢的,并且可能会给您带来严重的意外,包括安全问题
    • 不要在安装时构建可以在构建时构建的工件。所以发布预构建的 CSS 文件、requirejs 优化文件、预编译的二进制文件等。

    关于你的应用程序 RPM 是否应该将 node.js 列为依赖项或将节点嵌入到 RPM 中,这里有几点需要考虑。

    • 将 node.js 嵌入到您的 RPM 中
      • 要分发的单个 .rpm 文件
      • 允许您的应用程序严格控制它使用的节点版本。 (见下文)
      • 更高的可靠性。事实上,您的应用程序可能至少与您开发的 node.js 的次要版本(例如 0.8.x)或什至补丁版本(例如 >= 0.8.12
      • 尚不清楚 yumland 是否有任何官方/可靠的预构建 RPM 可以“正常工作”。
    • 将 node.js 指定为 PRM 的依赖项
      • 遵循操作系统包管理的一般理念(避免重复、节省磁盘空间等)
      • RPM 在库存管理、卸载、升级等方面提供了超越 TAR 的功能。既然您提出了这个问题,您可能还没有准备好正确解决这些问题,因此您可能希望从 tar 开始,一旦您有一个可靠的了解这一点,考虑 RPM 升级脚本等。
      • 一旦您的应用开始使用数据库或 3 个数据库,支持电子邮件、日志聚合器等守护进程,“分发单个文件”的好点很快就会变得站不住脚。

    【讨论】:

    • 我想我会走 RPM 路线,因为这是我的客户想要的。所以 RPM 将包含预先下载的所需 Node.JS 模块,以及我准备运行的代码。您是说 RPM 也不能包含 Node.JS 本身吗?
    • 我将更新我的答案以澄清关于将节点本身嵌入 RPM 的观点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    相关资源
    最近更新 更多