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

Posted

技术标签:

【中文标题】将 Meteor 应用程序从 OS X 部署到 Linux 会导致 bcrypt 问题【英文标题】:Deploying Meteor app from OS X to Linux causes bcrypt issues 【发布时间】:2015-03-15 02:05:33 【问题描述】:

我刚刚部署了我的第一个生产 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 上,所以问题就在于此。我的解决方法是从程序/服务器文件夹中运行npm install bcrypt,然后将其从programs/server/node_modules/bcrypt 复制到programs/server/npm。这似乎需要很多手动步骤。

我正要通过一些修复重新部署我的应用程序,我担心我将不得不再次执行相同的步骤。有没有更好的方法来部署一个不会遇到这个问题的 Meteor 应用程序?我目前的程序是:

    运行meteor build scp 生成的压缩包到我的服务器 (Digital Ocean) 在我的应用用户主目录中分解压缩包 添加步骤:重新编译 bcrypt 并按照上述说明复制目录

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

【问题讨论】:

【参考方案1】:

我遇到了完全相同的问题 - 我改用 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

希望对你有所帮助!

【讨论】:

我以为我在某个地方看到 mup 在 OS X 上无法运行。这只是服务器端的部分,还是客户端的部分? 这正是我所需要的! MUP 工作完美,在设置环境方面做得比我做得更好,并且允许我从桌面控制到尾日志并重新启动服务器,而无需登录。 不,我用的是MUP,但是还是出现这个问题【参考方案2】:

我遇到了同样的问题,并做了以下修复:

卸载 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

【讨论】:

【参考方案3】:

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

手动部署

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

以下是为我修复它的过程3、4

    npm目录中移除bcrypt模块:

    $ cd path_to_your_app/bundle/programs/server
    $ rm -rf npm/npm-bcrypt/node_modules/bcrypt/
    

    首先将 bcrypt 模块安装到node_modules 目录中。这会针对服务器的操作系统构建 bcrypt:

    $ npm install bcrypt
    

    将新创建的 bcrypt 模块移动到npm 目录:

    $ cp -r node_modules/bcrypt npm/npm-bcrypt/node_modules/bcrypt
    

    最后,重新启动应用程序、mogodb 和任何 Web 服务器进程,如 nginx6,如果您已配置,则通过 upstart。如果上述步骤没有为您解决问题,您可以在下面的健全步骤标题下执行。

使用 Meteor Up (mup)

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

    第一步是删除任何预先存在的应用程序和 nodejs 包。 Mup 将应用程序安装到/opt/ 中,您可以在其中找到your_appnodejs。删除它们。

    验证您在 mup.json 文件中是否拥有正确的节点版本,仅限 0.10.361 和以下设置:

    
    
     ...
    
      "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": ".",
    
     ...
    
    
    

    运行:

    $ mup setup
    $ mup deploy
    

    导航到服务器上的server 文件夹并重建模块:

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

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

    最后,重新启动应用程序、mogodb 和任何 Web 服务器进程,例如 nginx6。完成上述步骤后,您可能需要查看下面的健全步骤以了解更多调试选项。


健全的步骤

您还可以执行一些其他步骤:

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

然后删除或移动 apache2 conf 文件以防止其再次启动。所有配置文件都位于/etc/init/etc/init.d

使用$ mup logs -f 查看mup 日志。要查看应用程序中的错误,文件末尾/var/log/upstart/your_app.log 很有用(假设您已配置新贵)。

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

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

此外,请确保您在your_server_config 中指定了default_server5

检查 mongodb 是否可以运行。


参考文献

    Meteor 版本 1.0.4.1(于 2015 年 3 月末发布)要求安装节点版本 0.10.36。我建议使用节点版本管理器n,随时控制服务器上运行的节点版本。 Link。

    可怕的[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.

    程序从这里修改:Link。

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

    指定default_server。 Link。

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

【讨论】:

谢谢!你的回答太棒了,救了我一整天!手动步骤适用于我在 Ubuntu 12.04 LTS、nvm 和 nodejs 0.10.40 下使用 Meteor 1.2。我终于启动了我的 Meteor 应用程序!【参考方案4】:

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

【讨论】:

以上是关于将 Meteor 应用程序从 OS X 部署到 Linux 会导致 bcrypt 问题的主要内容,如果未能解决你的问题,请参考以下文章

将 Meteor 部署到 Google App Engine 2017

将 Meteor 应用程序部署到 Elastic Beanstalk

MongoDB / Meteor / 将 MONGO_URL 导出到已部署的应用程序

MongoDB / Meteor / 将 MONGO_URL 导出到已部署的应用程序

将 Meteor 应用程序部署到 Synology armv7:“node-fibers”存在问题

将 Meteor 项目部署到我自己的域?