将Meteor app从OS X部署到Linux会导致bcrypt问题

Cod*_*imp 7 meteor

我刚刚部署了我的第一个生产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)
Run Code Online (Sandbox Code Playgroud)

通过一些研究,似乎问题是bcrypt是特定于平台的,并且因为我的开发是在OS X 10.10上,但是我的生产服务器在Ubuntu 14.04上,因此存在问题.我的工作是npm install bcrypt从程序/服务器文件夹运行,然后从中复制programs/server/node_modules/bcryptprograms/server/npm.这似乎是很多手动步骤.

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

  1. meteor build
  2. scp导致tarball到我的服务器(数字海洋)
  3. 在我的应用用户主目录中爆炸tarball
  4. 添加步骤:重新编译bcrypt并如上所述复制目录

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

小智 5

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

手动部署

如果您手动部署应用程序,请确保使用节点v0.10.36 1并且仅使用该节点.Meteor与节点v0.12.x不兼容.更具体地说,光纤模块会引起很多问题,它会对各种错误产生影响2.

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

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

    $ cd path_to_your_app/bundle/programs/server
    $ rm -rf npm/npm-bcrypt/node_modules/bcrypt/
    
    Run Code Online (Sandbox Code Playgroud)
  2. 首先将bcrypt模块安装到node_modules目录中.这会针对服务器的操作系统构建bcrypt:

    $ npm install bcrypt
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将新创建的bcrypt模块移动到npm目录中:

    $ cp -r node_modules/bcrypt npm/npm-bcrypt/node_modules/bcrypt
    
    Run Code Online (Sandbox Code Playgroud)
  4. 最后,如果已配置,请通过upstart 重新启动应用程序,mogodb和任何Web服务器进程(如nginx 6).如果上面列出的步骤没有为您修复,则可以执行以下标题的完整性步骤.

使用Meteor Up(mup)

如果你正在使用mup,那么这个过程会更容易,因为这个线程上的其他答案指出了.但是,有时会出现包括invalid ELF header错误在内的错误.确保您拥有最新版本的mup npm update mup -g.

  1. 第一步是删除任何预先存在的app和nodejs包.MUP安装应用进入/opt/并在那里你可以找到your_appnodejs.删除它们.

  2. 请确认您有正确的节点版本0.10.36只有1和下面的设置,在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": ".",
    
     ...
    
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 跑:

    $ mup setup
    $ mup deploy
    
    Run Code Online (Sandbox Code Playgroud)
  4. 导航到server服务器上的文件夹并重建模块:

    $ cd /opt/your_app/app/programs/server
    $ npm rebuild
    $ npm install
    
    Run Code Online (Sandbox Code Playgroud)

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

  5. 最后,重新启动应用程序,mogodb和任何Web服务器进程,如nginx 6.完成上述步骤后,您可能需要查看下面的完整性步骤以获取更多调试选项.



理智的步骤

您还可以执行以下几个步骤:

  • 请注意,apache还可以将自身绑定到运行nginx的同一端口.查看应用程序的错误日志和Web服务器的错误日志,以查看是否存在任何问题.停止apache通过sudo service apache2 stop强制关闭(不推荐)端口80上的任何正在运行的进程.

    • 然后删除或移动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
    
    Run Code Online (Sandbox Code Playgroud)

    此外,请确保您已指定default_server5英寸your_server_config.

  • 检查mongodb是否可以运行.



参考

  1. Meteor版本1.0.4.1(2015年3月底发布)要求安装节点版本0.10.36.我建议使用节点版本管理器n来控制服务器上任何时候运行的节点版本.链接.

  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'?错误.链接.

  3. 该过程从此处修改:链接.

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

  5. 指定一个default_server.链接.

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


小智 2

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

希望这有一些帮助!