Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails/passor/Node.js:ExecJS";找不到JavaScript运行时";_Ruby On Rails_Node.js_Nginx_Passenger - Fatal编程技术网

Ruby on rails Rails/passor/Node.js:ExecJS";找不到JavaScript运行时";

Ruby on rails Rails/passor/Node.js:ExecJS";找不到JavaScript运行时";,ruby-on-rails,node.js,nginx,passenger,Ruby On Rails,Node.js,Nginx,Passenger,我试图使用Node.js作为Rails应用程序的JavaScript运行时。我在Ubuntu 12.0.4上使用带有Nginx的Phusion乘客模块作为我的web服务器。每次访问Rails应用程序时,我都会看到一个错误页面,该页面似乎是由Passenger生成的,指出ExecJS找不到JavaScript运行时。我在这里看到了很多帖子,它们要么建议您安装Node——我通过sudo apt get install Node——要么建议在您的文件中使用rubyracer+execjs。后一种解决方

我试图使用Node.js作为Rails应用程序的JavaScript运行时。我在Ubuntu 12.0.4上使用带有Nginx的Phusion乘客模块作为我的web服务器。每次访问Rails应用程序时,我都会看到一个错误页面,该页面似乎是由Passenger生成的,指出ExecJS找不到JavaScript运行时。我在这里看到了很多帖子,它们要么建议您安装Node——我通过
sudo apt get install Node
——要么建议在您的文件中使用rubyracer+execjs。后一种解决方案确实有效,但我更喜欢使用Node,特别是因为Heroku不鼓励使用therubyracer,因为它使用了“非常大的内存”

我遇到了一个问题,这表明我的web服务器运行的用户的路径中可能没有节点。我通过运行
sudo-u www-data-which-node
检查了这个问题,它返回
/usr/bin/node
。用户www数据是nginx运行的用户,也是拥有MyRails应用程序中所有文件的用户。我还查看了
/etc/environment
,我可以看到
/usr/bin
位于系统范围内。运行
sudo-u www-data node-v
也会返回预期的节点版本,因此它是可执行的

当我运行
RAILS\u ENV=production bundle exec rake assets:precompile
时,我没有得到任何错误。当我将ExecJS加载到带有IRB的交互式会话中时,我能够让它返回有效的运行时。我还尝试显式地添加
EXECJS_RUNTIME=Node
作为环境变量,但它只是说“Node.js(V8)RUNTIME不可用”。我已经尝试了很多东西,但我就是不能让它工作

以下是我访问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>'
无法启动Web应用程序 找不到JavaScript运行时。看见https://github.com/sstephenson/execjs 获取可用运行时的列表。(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`' /usr/lib/ruby/gems/2.1.0/gems/execjs-2.0.2/lib/execjs.rb:4:in`' /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`' /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层)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:在'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`' /srv/www/app/config/environment.rb:2:在'require'中 /srv/www/app/config/environment.rb:2:in`' config.ru:3:in'require' config.ru:3:in'block in' /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`' /usr/share/passenger/helper脚本/rack preload.rb:112:in'eval' /usr/share/passenger/helper脚本/rack preload.rb:112:in'preload_app' /usr/share/passenger/helper脚本/rack-preload.rb:158:in`' /usr/share/passenger/helper脚本/rack preload.rb:29:in`' /usr/share/passenger/helper脚本/rack preload.rb:28:in`'
我在上面的评论中说得太快了。在我的Hello World Rails应用程序(4.1,使用默认的Gemfile和config)上运行正常,我停止EC2实例对其进行快照,然后在重新启动时,我遇到了Exec.js错误,尽管节点(~0.11)安装在/usr/local/bin

但是,我编辑了我的`/etc/sudoers/文件

默认安全路径=/sbin:/bin:/usr/sbin:/usr/bin

致:

默认安全路径=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

我重新启动了服务器和Apache,一切正常。

因此,我发现了问题

首先,并非所有用户都可以安装Node。这就是说,Nginx应该作为用户运行,它已经安装并可供用户使用。不过,您需要记住将其保存在
nginx.conf
中:

user  ec2-user;
...

http {
    passenger_root /usr/local/rvm/gems/ruby-2.1.0/gems/passenger-4.0.42;
    passenger_ruby /usr/local/rvm/gems/ruby-2.1.0/wrappers/ruby;
    passenger_nodejs /usr/local/bin/node;
    passenger_default_user ec2-user;
...
其次,您还需要使节点的路径可用于非登录shell,即将其添加到
/etc/bashrc
并导出


您的环境可能不同,但这是要点。

我也有这个问题。这就是为我修好的。我将其添加到nginx.conf的顶部

env PATH;


当我专注于这个解决方案时,我还发现了这篇文章,它帮助我找到了正确的路径树:--他编辑了execjs代码,给出了节点的绝对路径。这起到了作用,帮助我找到了如何为乘客提供路径。

您能解决这个问题吗?我在Amazon EC2实例上也经历了同样的情况——当我从控制台(在服务器上)运行ExecJS::Runtimes.autodetect时,一切都正常,但从PassengerNope内部中断。我想不出来。我决定只使用rubyracer&execjs gems并称之为good。我可以确认这是一个持续的显示停止错误。我能够让Rails 4.1、Ruby 2.0与默认的Amazon Linux AMI一起工作,但当我重新启动服务器时,这个错误莫名其妙地出现了,尽管一切都没有改变。我很高兴即使我使用的是RoR应用程序,我仍然需要nodejs。算了吧,我宁愿一路走。不幸的是,这对我不起作用。节点安装在