我正在尝试使用Node.js作为我的Rails应用程序的JavaScript运行时。 我在Ubuntu 12.0.4上使用Nginx的Phusion Passenger模块作为我的Web服务器。 每当我访问我的Rails应用程序时,我都会看到一个错误页面,它看起来是从Passenger生成的,说明ExecJS找不到JavaScript运行时。 我在这里看到很多post,要么build议你安装节点 – 我已经通过sudo apt-get install node
或build议在你的Gemfile中使用therubyracer + execjs。 后面的解决scheme确实有效,但是我真的更喜欢使用Node,特别是因为Heroku 声明他们不鼓励使用therubyracer,而是因为它使用了“非常大的内存”。
我遇到了一个教程 ,该教程build议我的Web服务器运行的用户可能没有在其path中的节点。 我通过运行sudo -u www-data which node
查看了sudo -u www-data which node
,并返回了/usr/bin/node
。 用户www-data是nginx运行的用户,以及拥有Rails应用程序中所有文件的用户。 我也看了/etc/environment
,我可以看到/usr/bin
在系统范围的path中。 运行sudo -u www-data node -v
也会像预期的那样返回Node版本,所以它是可执行的。
当我运行RAILS_ENV=production bundle exec rake assets:precompile
我没有得到任何错误。 当我将ExecJS加载到IRB的交互式会话中时,我能够得到它返回一个有效的运行时。 我也尝试明确添加EXECJS_RUNTIME=Node
作为一个环境variables,但它只是说“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>'
我也有这个问题。 这是对我来说固定的。 我把它添加到我的nginx.conf的顶部
env PATH;
http://wiki.nginx.org/Coremodulee#env
当我解决这个解决方案时,我也发现这个帖子,帮助我开始吠叫正确的树: https ://forums.freebsd.org/viewtopic.php ?& t = 35539 – 他编辑的execjs代码给绝对路径到节点。 这工作,并帮助我找出如何给乘客的路径。
所以,我发现了这个问题。
首先,我的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
并导出。
你的环境可能不同,但这是主要的。
在我上面的评论中说得太快了。 在我的Hello World Rails应用程序(4.1,使用默认的Gemfile和config)时,情况正常,我停止了EC2实例来快照它,然后在重新启动时,尽管节点(〜0.11)被安装,我仍然遇到了Exec.js错误在/ usr / local / bin
不过,我编辑了我的/ etc / sudoers /文件
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
至:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
我重新启动服务器和Apache,事情按预期工作。