Ich versuche, Node.js als JavaScript-Laufzeit für meine Rails-Anwendung zu verwenden. Ich benutze das Phusion Passenger Modul mit Nginx als meinen Webserver unter Ubuntu 12.0.4. Jedes Mal, wenn ich meine Rails-Anwendung besuche, erhalte ich eine Fehlerseite, die scheinbar von Passenger generiert wurde und besagt, dass ExecJS keine JavaScript-Laufzeit finden kann. Ich habe zahlreiche Beiträge hier gesehen, die entweder vorschlagen, dass Sie Node installieren - was ich über sudo apt-get install node
getan habe - oder vorschlagen, dass Sie therubyracer + execjs in Ihrer Gemfile verwenden. Die letztere Lösung funktioniert tatsächlich, aber ich würde wirklich vorziehen, Node zu verwenden, besonders seit Heroku has stated, dass sie die Verwendung von therubyracer dazu tendieren, dass sie eine "sehr große Menge an Speicher" verwendet.Rails/Passenger/Node.js: ExecJS "Konnte keine JavaScript-Laufzeitumgebung finden"
Ich lief in eine tutorial die schlägt vor, dass der Benutzer, dass mein Webserver läuft möglicherweise nicht Knoten in seinem Pfad. Ich habe das überprüft, indem ich sudo -u www-data which node
ausgeführt habe und /usr/bin/node
zurückgibt. Der Benutzer www-data ist der Benutzer, unter dem nginx läuft, und der Benutzer, der alle Dateien in meiner Rails-Anwendung besitzt. Ich habe auch /etc/environment
betrachtet, und ich kann sehen, dass /usr/bin
im systemweiten Pfad ist. Wenn sudo -u www-data node -v
ausgeführt wird, wird auch die Node-Version wie erwartet zurückgegeben, sodass sie ausführbar ist.
Wenn ich RAILS_ENV=production bundle exec rake assets:precompile
ausführen, erhalte ich keine Fehler. Wenn ich ExecJS in eine interaktive Sitzung mit IRB geladen habe, kann ich eine gültige Laufzeit zurückgeben. Ich habe auch versucht, EXECJS_RUNTIME=Node
als Umgebungsvariable ausdrücklich hinzuzufügen, aber dann sagt es nur "Node.js (V8) Laufzeit ist nicht verfügbar" stattdessen. Ich habe viele Dinge ausprobiert und ich kann das nicht zur Arbeit bringen!
Hier ist der Fehler, den ich bekomme, wenn ich meine Rails App besuche. Wenn ich mir die Logdatei von Nginx anschaue, sehe ich ziemlich genau dasselbe.
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>'
Konnten Sie dieses Problem lösen? Ich habe das gleiche auf meiner Amazon EC2-Instanz erlebt - alles funktioniert gut, wenn ich ExecJS :: Runtimes.autodetect von der Konsole (auf dem Server) ausführen, bricht jedoch von innen Passenger – Yevgeniy
Nein. Ich konnte es nicht herausfinden. Ich entschied mich dafür, einfach nur Therubracer & Execs Edelsteine zu verwenden und es gut zu nennen. – Adam
Kann bestätigen, dass dies ein andauernder, aussetzender Fehler ist. Ich konnte Rails 4.1, Ruby 2.0 mit dem Standard Amazon Linux AMI arbeiten, aber sobald ich den Server neu gestartet habe, kommt dieser Fehler unerklärlicherweise auf, obwohl sich nichts geändert hat. –