1

我有带有 nodejs 的后端服务器并部署在 heroku 上。

问题是我需要使用一些带有 dll 文件的基于 fortran 的程序(64 位和 32 位都存在,并且使用了 64 位)。

为了处理所有这些,我编写了一些 C++ 代码(node-addon-api)。

带有 node-gyp 的 C++ 构建到 .node 文件,它在我的本地环境中工作。

但是,它在 heroku 上失败并出现以下错误。

Error: /app/refprop/refpropNapi.node: invalid ELF header

我找到了一些关于 ELF 标头错误的解释。经过一番搜索,我在下面找到了答案,它似乎完全适合我的情况。

当您在一个架构上构建,然后尝试在不同的架构(或某些情况下的平台)上使用相同的构建插件时,就会发生这种情况。

我的 node-addon-api 开发环境是 Windows 10、64 位。我的假设是 heroku 使用 Linux 操作系统,这就是编译的节点文件不起作用的原因。

总之,我有3个问题。

  1. 在 Docker 上编译 C++ 和 dll(我不知道如何在 Docker 中详细构建)会​​创建可以在 heroku 上执行的节点吗?

  2. 是否有必要对后端和 node-addon-api 进行 dockerize 以确保它们在相同的操作系统中运行?

  3. 似乎使用 docker 部署让 IaaS 更容易,这让我逃离了 PaaS (heroku),但我没有任何经验。这会是逃离heroku的一种方式吗?(我不想更多地使用服务器,因为我现在有足够的工作......)

4

1 回答 1

2

简短的回答:
编译后的 .node 必须与它被部署到的特定架构相匹配。在 docker 镜像中编译然后部署该 docker 镜像是一种方法,但它增加了复杂性,特别是围绕设置、使用和管理 docker 的额外步骤。使用 heroku 的build脚本对节点执行此操作的方法不太复杂。https://devcenter.heroku.com/changelog-items/1557https://devcenter.heroku.com/articles/nodejs-support#customizing-the-build-process

长答案:
这里有更多关于什么是 Heroku 'dyno' 的详细信息,它运行 Heroku 应用程序,作为背景。https://stackoverflow.com/a/21463495https://devcenter.heroku.com/articles/how-heroku-works#building-applications

他们用于新应用程序的堆栈列在https://devcenter.heroku.com/categories/stacks

目前这是:

_________________________________________________________________
|Stack Version       | Base Technology | Supported through      |
|Heroku-18 (default) | Ubuntu 18.04    | April 2023             |
|Heroku-16           | Ubuntu 16.04    | April 2021 Learn more  |
|Container           | Docker          | Developer-maintained*  |
_________________________________________________________________

堆栈具有在https://github.com/heroku/heroku-buildpack-nodejs中描述的节点构建包,用于构建您添加到 heroku 的节点应用程序。

您可以按照https://devcenter.heroku.com/articles/nodejs-support#customizing-the-build-processhttps://devcenter.heroku.com/changelog-items/1557中的描述自定义构建过程 这意味着您可以添加一个构建脚本,该脚本将在每次将您的应用程序添加到 heroku 时运行。

"scripts": {
  "start": "node index.js",
  "build": "build steps here to compile your dll on heroku using node-gyp or npm build or npm install"
}

或者您可以使用 heroku-prebuild 或 heroku-postbuild 脚本。

"scripts": {
  "heroku-prebuild": "echo This runs before Heroku installs your dependencies.",
  "heroku-postbuild": "echo This runs afterwards."
}

https://nodejs.org/api/addons.html#addons_building更详细地描述了如何构建 C++ 插件。

免责声明:我不是 Heroku 员工,最近也没有使用过 Heroku,所以我只按照公开文档中的描述进行。


考虑到关于您可能想要使用什么而不是 docker 的解释,以下是您列出的问题的答案:

  1. 在 Docker 上编译 C++ 和 dll(我不知道如何在 Docker 中详细构建)会​​创建可以在 heroku 上执行的节点吗?

是的。Heroku 直接支持 docker 容器,或者您可以在与 Heroku 使用的(例如 Ubuntu 18.04)匹配的 docker 映像上编译并使用该编译代码。

  1. 是否有必要对后端和 node-addon-api 进行 dockerize 以确保它们在相同的操作系统中运行?

如果您使用的是 docker 容器,后端和 node-addon-api 都需要在同一个 docker 映像中运行。如果你只在 docker 上编译,编译后的 c++ 需要匹配最终运行的 OS 节点。

  1. 似乎使用 docker 部署让 IaaS 更容易,这让我逃离了 PaaS (heroku),但我没有任何经验。这会是逃离heroku的一种方式吗?(我不想更多地使用服务器,因为我现在有足够的工作......)

是的。还有其他提供者提供可以运行节点服务器的 docker 容器服务。还有其他具有虚拟映像的云提供商可以运行节点服务器,而无需进行 dockerize。

于 2019-11-07T20:56:32.757 回答