Ada*_*dam 12 ruby-on-rails passenger nginx node.js
我正在尝试将Node.js用作我的Rails应用程序的JavaScript运行时.我在Ubuntu 12.0.4上使用带有Nginx的Phusion Passenger模块作为我的Web服务器.每次我访问我的Rails应用程序时,我都会看到一个错误页面,该页面似乎是从Passenger生成的,表明ExecJS无法找到JavaScript运行时.我在这里看过很多帖子,或者建议你安装Node - 我已经完成了 - sudo apt-get install node
或建议在你的Gemfile中使用therubyracer + execjs.后一个解决方案实际上确实有效,但我更喜欢使用Node,特别是因为Heroku 已经声明他们不鼓励使用therubyracer,因为它使用了"非常大量的内存".
我遇到了一个教程,建议我的web服务器运行的用户可能没有Node的路径.我通过跑步检查了sudo -u www-data which node
它,然后它返回/usr/bin/node
.用户www-data是nginx运行的用户,以及拥有我的Rails应用程序中所有文件的用户.我也看过了/etc/environment
,我可以看到这/usr/bin
是在系统范围内的路径.Running 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>'
Run Code Online (Sandbox Code Playgroud)
Dan*_*xon 25
我也有这个问题.这就是为我解决的问题.我把它添加到我的nginx.conf的顶部
env PATH;
Run Code Online (Sandbox Code Playgroud)
http://wiki.nginx.org/CoreModule#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;
...
Run Code Online (Sandbox Code Playgroud)
其次,您还需要使 Node 的路径可用于非登录 shell,即将其添加/etc/bashrc
并导出。
您的环境可能有所不同,但这就是要点。
我的上述评论说得太早了。在我的 Hello World Rails 应用程序(4.1,使用默认的 Gemfile 和配置)上一切正常,我停止了 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,一切都按预期工作。
归档时间: |
|
查看次数: |
4038 次 |
最近记录: |