将 Meteor 应用程序从 OS X 部署到 Linux 会导致 bcrypt 问题

Deploying Meteor app from OS X to Linux causes bcrypt issues

我刚刚部署了我的第一个生产版 Meteor 应用程序,但是 运行 遇到了一个非常重要的问题。当我尝试 运行 我的应用程序时,出现以下错误:

/home/hiapp/bundle/programs/server/node_modules/fibers/future.js:173
                        throw(ex);
                              ^
Error: /home/hiapp/bundle/programs/server/npm/npm-bcrypt/node_modules/bcrypt/build/Release/bcrypt_lib.node: invalid ELF header
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at bindings (/home/hiapp/bundle/programs/server/npm/npm-bcrypt/node_modules/bcrypt/node_modules/bindings/bindings.js:74:15)
    at Object.<anonymous> (/home/hiapp/bundle/programs/server/npm/npm-bcrypt/node_modules/bcrypt/bcrypt.js:1:97)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)

通过一些研究,问题似乎是 bcrypt 是特定于平台的,因为我的开发是在 OS X 10.10 上,但我的生产服务器是在 Ubuntu 14.04 上,所以- 这就是问题所在。我的解决方法是从 programs/server 文件夹中复制 运行 npm install bcrypt,然后将其从 programs/server/node_modules/bcrypt 复制到 programs/server/npm。这似乎有很多手动步骤。

我正准备通过一些修复重新部署我的应用程序,我担心我将不得不再次执行相同的步骤。有没有更好的方法可以在您不 运行 解决此问题的地方部署 Meteor 应用程序?我目前的程序是:

  1. 运行 meteor build
  2. scp 生成的 tarball 到我的服务器(Digital Ocean)
  3. 在我的应用程序用户主目录中解压 tarball
  4. 添加的步骤:重新编译 bcrypt 并如上所述复制目录

我猜自动刷新会被破坏,因为服务器第一次尝试加载新库时它会在火热的荣耀中爆炸。简单地在服务器上克隆 GIT 存储库并直接从那里进行构建会更好,还是我可以使用 mup 或任何其他工具来帮助简化部署过程?

我遇到了完全相同的问题 - 我改为使用 Meteor Up (MUP),问题消失了。更不用说它更简单了!

我在 youtube 上学习了这个教程 - https://www.youtube.com/watch?v=WLGdXtZMmiI 其中包括使用 MUP 部署到 Digital Ocean。

MUP 的 github 页面特别提到它处理二进制 NPM 模块 - https://github.com/arunoda/meteor-up#binary-npm-module-support

希望对您有所帮助!

我遇到了同样的问题并执行了以下操作来解决它:

  • 卸载nodejs

    sudo apt-get remove nodejs

  • 删除所有剩余文件

    rm -rf ~/.nvm ~/.npm

    sudo rm -rf /usr/bin/node /opt/nodejs /usr/lib/node_modules /usr/local/lib/node_modules

  • 从mup.json

    中的默认设置升级节点版本

    "nodeVersion": "0.10.33",

  • 运行 mup 设置和部署

    mup setup

    mup deploy

有两种方法可以解决这个 time-consuming 问题,这完全取决于您的部署方式。

手动部署

如果您手动部署应用程序,请确保您使用的是节点 v0.10.361,并且仅此而已。 Meteor 不适用于节点 v0.12.x。更具体地说,fibers 模块会导致很多问题,它会因各种错误而窒息2.

以下是我修复它的过程3, 4:

  1. npm 目录中删除 bcrypt 模块:

    $ cd path_to_your_app/bundle/programs/server
    $ rm -rf npm/npm-bcrypt/node_modules/bcrypt/
    
  2. 首先将 bcrypt 模块安装到 node_modules 目录中。这会针对服务器的 OS:

    构建 bcrypt
    $ npm install bcrypt
    
  3. 将新建的bcrypt模块移动到npm目录中:

    $ cp -r node_modules/bcrypt npm/npm-bcrypt/node_modules/bcrypt
    
  4. 最后,重启应用程序、mogodb和任何网络服务器进程,如nginx6,通过upstart if你已经配置好了。如果上面概述的步骤没有为您解决问题,您可以在下面的理智步骤标题下执行。

使用流星向上(mup)

如果您使用的是 mup,那么这个过程会容易得多,因为该线程上的其他答案指出了这一点。但是,在某些情况下仍然会出现错误,包括 invalid ELF header 错误。确保你有最新版本的 mup npm update mup -g.

  1. 第一步是删除任何 pre-existing 应用程序和 nodejs 包。 Mup 将应用程序安装到 /opt/ 中,您可以在其中找到 your_appnodejs。删除它们。

  2. 验证您的节点版本是否正确,仅 0.10.361 以及 mup.json 文件中的以下设置:

    {
    
     ...
    
      "setupMongo": true,
      "setupNode": true,
      "nodeVersion" : "0.10.36",
      "setupPhantom": true,
      "enableUploadProgressBar": true,
    
      // Application name (No spaces)
      "appName": "your_app",
    
      // Location of app (local directory)
      "app": ".",
    
     ...
    
    }
    
  3. 运行:

    $ mup setup
    $ mup deploy
    
  4. 导航到服务器上的 server 文件夹并重建模块:

    $ cd /opt/your_app/app/programs/server
    $ npm rebuild
    $ npm install
    

    可选:$ sudo npm update node-gyp -g

  5. 最后,重启 应用程序、mogodb 和任何网络服务器进程,例如 nginx6。完成上述步骤后,您可能需要查看下面的 sanity steps 以获得更多调试选项。



理智步数

您还可以执行其他几个步骤:

  • 请注意,apache 也可能将自己绑定到 nginx 运行正在使用的同一端口。查看应用程序的错误日志和网络服务器的错误日志,看看是否存在任何问题。通过 sudo service apache2 stopbrute force close(不推荐)在端口 80 上停止任何 运行ning 进程。

    • 然后删除或移动 apache2 conf 文件以防止它再次启动。所有 conf 文件位于 /etc/init/etc/init.d.
  • 使用$ mup logs -f查看mup日志。要从您的应用程序中查看错误,文件末尾 /var/log/upstart/your_app.log 很有用(假设您配置了 upstart)。

  • 如果使用 nginx,请确保您的目录是符号链接。

    $ ln -s /etc/nginx/sites-available/your_server_config /etc/nginx/sites-enabled/your_server_config
    

    此外,请确保您在 your_server_config.

  • 中指定了 default_server5
  • 检查mongodb是否可以运行。



参考资料

  1. Meteor 版本 1.0.4.1(2015 年 3 月末发布)需要安装节点版本 0.10.36。我推荐使用节点版本管理器,n, to control what version of node is running on your server at any one time. Link.

  2. 可怕的 [XXX.XX.XXX.XX] Error: '/opt/your_app/programs/server/node_modules/fibers/bin/linux-x64-v8-3.28/fibers.node' is missing. Try reinstalling 'node-fibers'? 错误。 Link.

  3. 程序从这里修改:Link.

  4. 为了您的信息,我使用了 DigitalOcean 的非常有用的指南将流星应用程序部署到服务器。 Link.

  5. 指定 default_serverLink.

  6. 常见的重启进程有:sudo service mongod/nginx/yourapp restart.

运行 npm rebuildbundle/programs/server/npm/ 应该负责为服务器平台重建模块,无论原始应用程序是捆绑在 Linux 还是 MacOS。