将 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_app
和nodejs
。删除它们。
验证您在 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 上任何正在运行的进程。
/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_server
5。
检查 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 导出到已部署的应用程序