【发布时间】:2014-06-01 05:32:45
【问题描述】:
我正在尝试使用 Node.js 作为我的 Rails 应用程序的 JavaScript 运行时。我在 Ubuntu 12.0.4 上使用 Phusion Passenger 模块和 Nginx 作为我的 Web 服务器。每次访问我的 Rails 应用程序时,我都会收到一个错误页面,该页面似乎是从 Passenger 生成的,指出 ExecJS 找不到 JavaScript 运行时。我在这里看到很多帖子,要么建议你安装 Node——我通过sudo apt-get install node 完成了——要么建议在你的 Gemfile 中使用 therubyracer + execjs。后一种解决方案确实有效,但我真的更喜欢使用 Node,特别是因为 Heroku has stated 他们不鼓励使用 therubyracer,因为它使用“非常大量的内存”。
我遇到了tutorial,这表明运行我的 Web 服务器的用户可能在其路径中没有 Node。我通过运行sudo -u www-data which node 进行了检查,它返回/usr/bin/node。用户 www-data 是运行 nginx 的用户,也是拥有我的 Rails 应用程序中所有文件的用户。我还查看了/etc/environment,我可以看到/usr/bin 在系统范围的路径中。运行sudo -u www-data node -v 也会按预期返回Node 版本,因此它是可执行的。
当我运行RAILS_ENV=production bundle exec rake assets:precompile 时,我没有收到任何错误。当我将 ExecJS 加载到与 IRB 的交互式会话中时,我能够让它返回一个有效的运行时。我也尝试过明确添加EXECJS_RUNTIME=Node 作为环境变量,但它只是说“Node.js (V8) 运行时不可用”。我已经尝试了很多东西,但我无法让它工作!
这是我在访问我的 Rails 应用程序时遇到的错误。当我查看 Nginx 日志文件时,我看到的内容几乎相同。
Web application could not be started
Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
/usr/lib/ruby/gems/2.1.0/gems/execjs-2.0.2/lib/execjs/runtimes.rb:51:in `autodetect'
/usr/lib/ruby/gems/2.1.0/gems/execjs-2.0.2/lib/execjs.rb:5:in `<module:ExecJS>'
/usr/lib/ruby/gems/2.1.0/gems/execjs-2.0.2/lib/execjs.rb:4:in `<top (required)>'
/usr/lib/ruby/gems/2.1.0/gems/uglifier-2.5.0/lib/uglifier.rb:3:in `require'
/usr/lib/ruby/gems/2.1.0/gems/uglifier-2.5.0/lib/uglifier.rb:3:in `<top (required)>'
/usr/lib/ruby/gems/2.1.0/gems/bundler-1.6.1/lib/bundler/runtime.rb:76:in `require'
/usr/lib/ruby/gems/2.1.0/gems/bundler-1.6.1/lib/bundler/runtime.rb:76:in `block (2 levels) in require'
/usr/lib/ruby/gems/2.1.0/gems/bundler-1.6.1/lib/bundler/runtime.rb:72:in `each'
/usr/lib/ruby/gems/2.1.0/gems/bundler-1.6.1/lib/bundler/runtime.rb:72:in `block in require'
/usr/lib/ruby/gems/2.1.0/gems/bundler-1.6.1/lib/bundler/runtime.rb:61:in `each'
/usr/lib/ruby/gems/2.1.0/gems/bundler-1.6.1/lib/bundler/runtime.rb:61:in `require'
/usr/lib/ruby/gems/2.1.0/gems/bundler-1.6.1/lib/bundler.rb:132:in `require'
/srv/www/app/config/application.rb:7:in `<top (required)>'
/srv/www/app/config/environment.rb:2:in `require'
/srv/www/app/config/environment.rb:2:in `<top (required)>'
config.ru:3:in `require'
config.ru:3:in `block in <main>'
/usr/lib/ruby/gems/2.1.0/gems/rack-1.5.2/lib/rack/builder.rb:55:in `instance_eval'
/usr/lib/ruby/gems/2.1.0/gems/rack-1.5.2/lib/rack/builder.rb:55:in `initialize'
config.ru:1:in `new'
config.ru:1:in `<main>'
/usr/share/passenger/helper-scripts/rack-preloader.rb:112:in `eval'
/usr/share/passenger/helper-scripts/rack-preloader.rb:112:in `preload_app'
/usr/share/passenger/helper-scripts/rack-preloader.rb:158:in `<module:App>'
/usr/share/passenger/helper-scripts/rack-preloader.rb:29:in `<module:PhusionPassenger>'
/usr/share/passenger/helper-scripts/rack-preloader.rb:28:in `<main>'
【问题讨论】:
-
你能解决这个问题吗?我在我的 Amazon EC2 实例上遇到了同样的情况 - 当我从控制台(在服务器上)运行 ExecJS::Runtimes.autodetect 时一切正常,但从乘客内部中断
-
不。我想不通。我决定只使用 therubyracer 和 execjs gems 并称之为好。
-
可以确认这是一个持续的、显示停止的错误。我能够让 Rails 4.1、Ruby 2.0 与默认的 Amazon Linux AMI 一起工作,但是一旦我重新启动服务器,这个错误就莫名其妙地出现了,即使没有任何改变。
-
很高兴即使我正在使用 RoR 应用程序,我仍然需要 nodejs。 fsck 它,我宁愿一路去节点。
标签: ruby-on-rails node.js nginx passenger