【问题标题】:Deployment of Node native modules to Azure WebSites将 Node 本机模块部署到 Azure 网站
【发布时间】:2014-09-28 08:40:06
【问题描述】:

我正在尝试将以下示例节点应用程序部署到 Azure 网站:

var http = require('http');
var port = process.env.port || 1337;

http.createServer(function (req, res) {
    res.writeHead(200, { 'Content-Type': 'text/html' });

    try {

        var canvasModule = require('canvas'), 
            canvas = new canvasModule(200, 200), 
            ctx = canvas.getContext('2d');

        ctx.rotate(0.5);

        ctx.font = '30px Impact';
        var message = "Hello World";
        ctx.fillText(message, 40, 40);

        ctx.strokeRect(30, 5, 160, 50);

        res.end('<html><img src="' + canvas.toDataURL() + '" /></html>');

    } catch (e) {
        res.end('Error: ' + e);
    }

}).listen(port);

棘手的部分是我正在使用一个名为“canvas”的节点模块,需要在安装时使用 node-gyp 进行编译。

根据this Azure 网站不支持 Microsoft 页面原生模块,应将模块的编译版本复制到 Azure 以使应用正常工作:

原生模块

虽然大多数模块只是纯文本 JavaScript 文件,但有些 模块是特定于平台的二进制图像。这些模块是 在安装时编译,通常使用 Python 和 node-gyp。一 Azure 网站的具体限制是,虽然它本机 了解如何安装 package.json 中指定的模块或 npm-shrinkwrap.json 文件,它不提供 Python 或 node-gyp 和 无法构建原生模块。

由于 Azure 云服务依赖于 node_modules 文件夹 作为应用程序的一部分部署,任何本机模块都包含在 部分安装的模块应该在云服务中工作,只要 因为它是在 Windows 开发系统上安装和编译的。

Azure 网站不支持本机模块。一些模块 比如 JSDOM 和 MongoDB 有可选的原生依赖,并且会 使用托管在 Azure 网站中的应用程序。

我将所有内容都部署到了 Azure(使用发布向导),并且所有文件都发送到了 Azure(显然至少是这样),包括已编译的模块。在 Azure 上运行该站点时,出现以下异常:

Error: The specified module could not be found.
D:\home\site\wwwroot\node_modules\canvas\build\Release\canvas.node

但该文件实际上已部署在服务器上:

创建虚拟机显然是一种选择,但我更喜欢使用网站。有人知道我可以试试吗?

【问题讨论】:

    标签: node.js azure azure-web-app-service node-modules azure-deployment


    【解决方案1】:

    错误消息“找不到指定的模块”有点误导。它可能意味着一个或多个依赖的dll没有找到。

    我假设您在 Windows 中使用了 build instruction。如果您根据说明中的 GTK2 zip 文件构建了画布,您可以将 %GTKDIR%\bin\freetype6.dll 复制到 %YourApp%\node_modules\canvas\build\Release。在构建过程中不会复制此 dll。您还需要将其部署到 VM 上。或者您可以针对Windows GTK3 bundle 构建画布。

    不幸的是,即使在您拥有所有 dll 之后,Azure 网站的沙盒似乎仍会阻止画布运行。希望它会在不久的将来启用。

    【讨论】:

    • 感谢您的信息。复制“freetype6.dll”后,该站点不再抛出错误,但我只得到一个空图像。我会接受你的回答,因为这似乎是一项不可能的工作......
    【解决方案2】:

    好的,今天开始工作了!

    您需要部署您的node_modules 目录,此外您还需要将gtk/bin 的所有内容复制到您的应用程序的根目录,这使得它有点混乱,但它可以工作。我想您可以更改路径以寻找其他地方,但我需要让应用程序运行,所以我没有进一步调查。

    【讨论】:

      【解决方案3】:

      @mtian 回答中的最后一行是关键。您可以花时间部署它,但最终 Azure 网站 VM 缺少 node-canvas 执行所依赖的 GDI+ API(可能出于安全考虑而被阻止)。如果您想在 Azure 上使用 node-canvas,则不能使用 Azure 网站,而是需要设置和管理自己的虚拟机。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      相关资源
      最近更新 更多