2014-04-17 17 views
12

Tôi đang cố gắng sử dụng Node.js làm thời gian chạy JavaScript cho ứng dụng Rails của mình. Tôi đang sử dụng mô-đun Phusion Passenger với Nginx làm máy chủ web của tôi trên Ubuntu 12.0.4. Mỗi lần tôi truy cập ứng dụng Rails của tôi, tôi nhận được một trang lỗi xuất hiện được tạo ra từ Hành khách nói rằng ExecJS không thể tìm thấy thời gian chạy JavaScript. Tôi đã nhìn thấy rất nhiều bài viết trên đây hoặc là đề nghị rằng bạn cài đặt Node - mà tôi đã thực hiện thông qua sudo apt-get install node - hoặc đề nghị sử dụng therubyracer + execjs trong Gemfile của bạn. Đó là giải pháp thứ hai trong thực tế công việc, nhưng tôi thực sự muốn sử dụng Node, đặc biệt là kể từ Heroku has stated rằng họ không khuyến khích sử dụng therubyracer làm cho thực tế là nó sử dụng một "số lượng rất lớn của bộ nhớ".Đường ray/Hành khách/Node.js: ExecJS "Không thể tìm thấy thời gian chạy JavaScript"

Tôi chạy vào một tutorial cho thấy rằng người dùng mà máy chủ web của tôi chạy có thể không có nút trong đường dẫn của nó. Tôi đã kiểm tra điều này bằng cách chạy sudo -u www-data which node và trả về /usr/bin/node. Người dùng www-data là người dùng mà nginx chạy và người dùng sở hữu tất cả các tệp trong ứng dụng Rails của tôi. Tôi cũng đã xem /etc/environment và tôi có thể thấy rằng /usr/bin nằm trong đường dẫn toàn hệ thống. Chạy sudo -u www-data node -v cũng trả về phiên bản Nút như mong đợi, vì vậy nó có thể thực thi được.

Khi tôi chạy RAILS_ENV=production bundle exec rake assets:precompile Tôi không gặp bất kỳ lỗi nào. Khi tôi tải ExecJS vào một phiên tương tác với IRB tôi có thể làm cho nó trả về một thời gian chạy hợp lệ. Tôi cũng đã cố gắng thêm một cách rõ ràng EXECJS_RUNTIME=Node làm biến môi trường, nhưng sau đó nó chỉ nói "Thời gian chạy Node.js (V8) không có sẵn" thay thế. Tôi đã thử nhiều thứ và tôi không thể làm việc này được!

Đây là lỗi tôi nhận được khi tôi truy cập ứng dụng Rails của mình. Khi tôi nhìn vào tập tin đăng nhập Nginx tôi thấy khá nhiều điều tương tự.

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

Bạn có thể giải quyết vấn đề này không? Tôi đang trải qua cùng một ví dụ trên Amazon EC2 của tôi - mọi thứ hoạt động tốt khi tôi chạy ExecJS :: Runtimes.autodetect từ giao diện điều khiển (trên máy chủ), nhưng bị ngắt từ bên trong Hành khách – Yevgeniy

+0

Không. Tôi không thể hiểu được. Tôi quyết định chỉ sử dụng đá quý therubyracer & execjs và gọi nó là tốt. – Adam

+0

Có thể xác nhận rằng đây là lỗi liên tục, dừng hiển thị. Tôi đã có thể nhận được Rails 4.1, Ruby 2.0 làm việc với AMI Amazon Linux mặc định, nhưng ngay sau khi tôi khởi động lại máy chủ, lỗi này không thể giải thích được, mặc dù không có gì thay đổi. –

Trả lời

1

Nói quá sớm trong nhận xét ở trên của tôi. Mọi thứ hoạt động tốt trên ứng dụng Hello World Rails (4.1, với Gemfile và cấu hình mặc định), tôi dừng bản sao EC2 để chụp nhanh, sau đó khởi động lại, tôi gặp lỗi Exec.js mặc dù nút (~ 0.11) được lắp đặt tại/usr/local/bin

Tuy nhiên, tôi thay đổi nội dung của tôi `/ etc/sudoers/tập tin từ

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

tới:

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

Tôi khởi động lại máy chủ và Apache và mọi thứ đã hoạt động như mong đợi.

+1

Thật không may là không hiệu quả với tôi. Nút được cài đặt tại/usr/bin trên máy chủ của tôi, mặc định là trong secure_path. Trong mọi trường hợp, tại sao chỉnh sửa/etc/sudoers sẽ khắc phục được sự cố? – Adam

4

Vì vậy, tôi đã tìm thấy sự cố.

Trước tiên, cài đặt Nút của tôi không dành cho tất cả người dùng. Điều đó nói rằng, nó đã được cài đặt và có sẵn cho người dùng mà Nginx được cho là chạy. Tuy nhiên, bạn cần phải nhớ để có điều này trong nginx.conf của bạn:

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

Thứ hai, bạn cũng cần phải thực hiện các đường dẫn đến Node có sẵn cho vỏ không đăng nhập, tức là thêm nó vào /etc/bashrc và xuất khẩu.

Môi trường của bạn có thể khác, nhưng đây là ý chính.

+0

Tôi vừa thử điều này và tiếc là nó không hoạt động cho máy chủ của tôi. – Adam

+1

thêm hành khách_nodej vào khối cấu hình máy chủ hoặc nginx.conf đã giải quyết được sự cố của tôi. cảm ơn bạn. – Kirka121

24

Tôi cũng gặp sự cố này. Đây là thứ đã sửa cho tôi. Tôi đã thêm nó vào đầu nginx của tôi.conf

env PATH; 

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

Như tôi đã tập trung vào công giải pháp này tôi cũng tìm thấy bài viết này mà đã giúp tôi bắt đầu sủa lên cây ngay: https://forums.freebsd.org/viewtopic.php?&t=35539 - ông chỉnh sửa mã execjs để đưa ra một đường dẫn tuyệt đối đến nút . Điều này làm việc và giúp tôi tìm ra cách đưa con đường cho hành khách.

+0

Nó thực sự làm việc, Thanks.But Tôi không có ý tưởng tại sao hành khách không thể tìm thấy con đường của nodejs? – timlentse

Các vấn đề liên quan