2014-04-17 8 views
12

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>' 
+0

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

+0

Nein. Ich konnte es nicht herausfinden. Ich entschied mich dafür, einfach nur Therubracer & Execs Edelsteine ​​zu verwenden und es gut zu nennen. – Adam

+0

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. –

Antwort

1

Spreche zu früh in meinem obigen Kommentar. Dinge waren funktioniert gut auf meiner Hello World Rails App (4.1, mit dem Standard-Gemfile und Konfig), stoppte ich die EC2-Instanz Snapshot es, dann beim Neustart lief ich in diesem Exec.js Fehler trotz Knoten (~ 0.11) in/usr/local/bin

jedoch installiert, bearbeitet ich meine `/ etc/sudoers/Datei aus

Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

zu:

Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

Ich habe den Server und Apache neu gestartet und die Dinge haben wie erwartet funktioniert.

+1

Leider funktioniert das nicht für mich. Der Knoten ist unter/usr/bin auf meinem Server installiert, der sich standardmäßig in secure_path befindet. Warum sollte/etc/sudoers das Problem auf jeden Fall beheben? – Adam

4

Also, ich habe das Problem gefunden.

Erstens war meine Installation von Node nicht für alle Benutzer. Das heißt, es war installiert und verfügbar für den Benutzer, dass Nginx als ausgeführt werden sollte. Dennoch müssen Sie sich daran zu erinnern in Ihrem nginx.conf zu haben:

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; 
... 

Zweitens müssen Sie auch den Weg für Nicht-Login-Shells auf Knoten machen, das heißt, es zu /etc/bashrc und Export hinzuzufügen.

Ihre Umgebung kann anders sein, aber das ist der Kernpunkt.

+0

Ich habe es gerade versucht und leider hat es nicht für meinen Server funktioniert. – Adam

+1

das Hinzufügen von passagier_nodejs zum Serverkonfigurationsblock oder nginx.conf hat mein Problem gelöst. Danke. – Kirka121

24

Ich hatte dieses Problem auch. Das hat es für mich behoben. Ich habe das oben auf meinem nginx hinzugefügt.conf

env PATH; 

http://wiki.nginx.org/CoreModule#env

Wie ich auch diesen Beitrag gefunden auf diese Lösung auf Null gesetzt in I, die mir den richtigen Holzweg geholfen zu starten: https://forums.freebsd.org/viewtopic.php?&t=35539 - er bearbeitet die execjs Code einen absoluten Pfad zu dem Knoten geben . Das hat mir geholfen und mir geholfen, herauszufinden, wie man Fahrgästen den Weg weisen kann.

+0

Es funktioniert wirklich, Danke. Aber ich habe keine Ahnung, warum Passagier den Weg von Nodejs nicht finden konnte? – timlentse

Verwandte Themen