2013-07-28 40 views
40

Ứng dụng của tôi hoạt động tốt khi chạy trong môi trường phát triển. Trong sản xuất (rails server -e production), trình duyệt không thể truy cập các tập tin css và js và trên console có những tin nhắn như:Ứng dụng Rails không phân phối tài sản trong môi trường sản xuất

I, [2013-07-27T21:00:59.105459 #11449] INFO -- : Started GET "/javascripts/application.js" for 99.102.22.124 at 2013-07-27 21:00:59 +0000 
F, [2013-07-27T21:00:59.108302 #11449] FATAL -- : 
ActionController::RoutingError (No route matches [GET] "/javascripts/application.js"): 

Phần đầu từ nguồn html khi trong môi trường sản xuất:

<head> 
    <title>a Social Server</title> 
    <link data-turbolinks-track="true" href="/stylesheets/application.css" media="all" rel="stylesheet"> 
    <link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css" rel="stylesheet"> 
    <script data-turbolinks-track="true" src="/javascripts/application.js"></script> 
    <meta content="authenticity_token" name="csrf-param"> 
<meta content="jYM4IAXTXAuKWeD4FEVrXgXRNFeB6EazU68ZBQfRqNY=" name="csrf-token"> 
</head> 

Trong env phát triển, mặt khác phần đầu trông giống như:

<head> 
    <title>a Social Server</title> 
    <link data-turbolinks-track="true" href="/assets/application.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/twitter-bootstrap-static/bootstrap.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/twitter-bootstrap-static/fontawesome.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/bootstrap_and_overrides.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/instagram.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/socialserver.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.core.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.theme.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.accordion.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.menu.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.autocomplete.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.button.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.datepicker.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.resizable.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.dialog.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.progressbar.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.selectable.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.slider.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.spinner.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.tabs.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.tooltip.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.base.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.all.css?body=1" media="all" rel="stylesheet"> 
    <link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css" rel="stylesheet"> 
    <script data-turbolinks-track="true" src="/assets/jquery.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery_ujs.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-transition.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-alert.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-modal.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-dropdown.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-scrollspy.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-tab.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-tooltip.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-popover.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-button.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-collapse.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-carousel.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-typeahead.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-affix.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/turbolinks.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/bootstrap.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.core.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.widget.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.accordion.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.position.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.menu.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.autocomplete.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.button.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.datepicker.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.mouse.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.draggable.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.resizable.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.dialog.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.droppable.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-blind.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-bounce.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-clip.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-drop.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-explode.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-fade.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-fold.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-highlight.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-pulsate.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-scale.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-shake.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-slide.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-transfer.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.progressbar.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.selectable.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.slider.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.sortable.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.spinner.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.tabs.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.tooltip.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.all.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/application.js?body=1"></script> 
    <meta content="authenticity_token" name="csrf-param"> 
<meta content="jYM4IAXTXAuKWeD4FEVrXgXRNFeB6EazU68ZBQfRqNY=" name="csrf-token"> 
</head> 

các ứng dụng không sử dụng một cơ sở dữ liệu, vì vậy tôi đã vô hiệu hóa ActiveRecord. Snippets của các tập tin cấu hình:

application.rb

require File.expand_path('../boot', __FILE__) 
#require 'rails/all' 
require "action_controller/railtie" 
require "action_mailer/railtie" 
require "rails/test_unit/railtie" 
require "sprockets/railtie" 
Bundler.require(:default, Rails.env) 
module Socialserver 
    class Application < Rails::Application 
    end 
end 

production.rb

Socialserver::Application.configure do 
    config.cache_classes = true 
    config.eager_load = true 
    config.consider_all_requests_local  = false 
    config.action_controller.perform_caching = true 
    config.serve_static_assets = false 
    config.assets.js_compressor = :uglifier 
    config.assets.compile = false 
    config.assets.digest = true 
    config.assets.version = '1.0' 
    config.log_level = :info 
    config.i18n.fallbacks = true 
    config.active_support.deprecation = :notify 
    config.log_formatter = ::Logger::Formatter.new 
    config.assets.paths << Rails.root.join('app', 'assets', 'fonts') 
    config.assets.precompile += %w(.svg .eot .woff .ttf) 
end 

development.rb:

Socialserver::Application.configure do 
    config.cache_classes = false 
    config.eager_load = false 
    config.consider_all_requests_local  = true 
    config.action_controller.perform_caching = false 
    config.action_mailer.raise_delivery_errors = false 
    config.active_support.deprecation = :log 
    config.assets.debug = true 
end 

Gemfile:

source 'https://rubygems.org' 
gem 'rails', '4.0.0' 
gem 'sass-rails', '~> 4.0.0' 
gem 'uglifier', '>= 1.3.0' 
gem 'coffee-rails', '~> 4.0.0' 
gem 'jquery-rails' 
gem 'jquery-ui-rails' 
gem 'turbolinks' 
gem 'jbuilder', '~> 1.2' 
group :doc do 
    gem 'sdoc', require: false 
end 
group :twitter do 
    gem 'twitter', '4.8.1' 
end 
group :instagram do 
    gem 'instagram', '0.10.0' 
end 
group :tumblr do 
    gem 'tumblr_client' 
end 
gem 'twitter-bootstrap-rails' 
gem 'therubyracer' #needed for runtime js on amazon ec2. 

Tôi xin lỗi vì đã đăng rất nhiều thông tin. Tôi cảm thấy thông tin có thể có liên quan.

p.s. Tôi chỉ có một nửa kiến ​​thức về đường ray, vì vậy hãy chịu đựng tôi. Cảm ơn ~

+0

Tôi đang gặp sự cố tương tự trong dự án tôi đã nâng cấp lên Rails 4. Không có giải pháp nào ở đây giải quyết được. Các hình ảnh và javascripts đang được phục vụ tốt, nhưng không phải là css. Các tệp css đang biên dịch, hiển thị ở dạng công khai/tài sản và hiển thị trong tệp kê khai, nhưng máy chủ sản xuất vẫn cung cấp cho tôi lỗi này đối với các tệp css. Nếu có ai có ý tưởng nào, tôi rất sẵn lòng biết chúng. –

Trả lời

6

Trong production.rb thay đổi thiết lập:

ray 3.x

config.serve_static_assets = true 

ray 4.x

config.serve_static_files = true 
+0

Đã thử, không hoạt động. – septerr

+0

Tôi đoán nó rails-3 cụ thể. –

66

Khi thử nghiệm tại địa phương môi trường sản xuất của bạn, bạn phải biên dịch tài sản cục bộ. Chỉ cần chạy lệnh dưới đây:

RAILS_ENV=production bundle exec rake assets:precompile 

Nó sẽ tạo tất cả các tài sản theo public/assets.

Tiếp theo, bạn phải yêu cầu Rails tự phân phát nội dung. Phần mềm máy chủ (ví dụ: Nginx hoặc Apache) làm điều đó cho bạn trên các môi trường như Heroku, nhưng tại địa phương bạn nên để Rails làm điều đó. Thay đổi này trong production.rb của bạn:

config.serve_static_assets = true 

Nhưng chắc chắn rằng bạn đặt nó trở lại false trước khi đẩy mã của bạn để sản xuất!

+0

Tôi đang cố triển khai ứng dụng này trên máy ec2. Trên ec2 tôi cài đặt ruby, ray và sau đó đã làm một "máy chủ rails -e sản xuất". Vì vậy, tôi đoán chỉ đơn giản là nói cho các lệnh máy chủ rails rằng env là sản xuất không gây ra nó để biên dịch các tài sản? Btw, nếu tôi đặt config.assets.compile = true trong production.rb, mọi thứ sẽ hoạt động trở lại. Vậy cách tốt nhất để làm điều đó là gì nếu bạn muốn tự mình triển khai ứng dụng? Nếu tôi sử dụng kỳ lân thay vì webrick, điều đó có tạo nên sự khác biệt không? – septerr

+1

Telling Rails rằng môi trường là sản xuất không biên dịch các tài sản thực sự. Bạn cần phải biên dịch trước chúng tại địa phương. Bạn có thể xem xét bài viết này cho thấy cách sử dụng gem_seccountync để đẩy nội dung của bạn tới S3 và Cloudfront: http://blog.firmhouse.com/complete-guide-to-serving-your-rails-assets -over-s3-with-asset_sync – jibai31

+0

Nếu 'sotware máy chủ (ví dụ Nginx hoặc Apache) làm điều đó cho tôi. Trong sự hiểu biết của tôi hơn nó có nghĩa là ở phía máy chủ nó được đặt thành 'TRUE' (' config.serve_static_assets = true') nhưng tại sao tôi nên đặt nó về 'FALSE' trước khi đẩy nó vào máy chủ? –

36

Điều này nghe có vẻ như là problem I was having.

Tôi tìm thấy một blog gợi ý rằng đây là một lỗi trong các đường ống dẫn tài sản Rails 4.0.0, và được hiểu sao giảm nhẹ bằng cách thiết lập ...

config.assets.compile = true 

...trong config/environments/production.rb

Ngoài việc bằng cách nào đó đá đường ống nội dung vào để thực sự hoạt động, cài đặt đó sẽ bật tính năng biên dịch trực tiếp nội dung. Đó thường là một điều xấu cho hiệu suất trong sản xuất, nhưng nếu bạn vẫn tài sản bằng tay precompile khi bạn triển khai, với

rake assets:precompile 

... live-biên soạn bao giờ nên xảy ra (vì tài sản cần thiết đã được biên dịch sẵn) .

Tôi hy vọng điều này sẽ giúp :)

+1

Điều này làm việc cho tôi. Tôi đang sử dụng Rails 4.1 – EastsideDeveloper

+1

Hoạt động với 4.2. Điều này có lẽ đã cứu tôi một vài giờ đau đớn tốt - Cảm ơn! –

+1

làm việc cho tôi với đường ray 4.1.5 –

0

Lệnh sau hoạt động cho tôi cục bộ.

rails server -e production 

Tôi đã nhận lỗi cùng "ActionController :: RoutingError (Không có trận đấu đường [GET] '/assets/application.css'" khi chạy "đường ray s". Ngay cả sau khi tôi biên dịch sẵn nguồn, thay đổi cấu hình precompile sự thật. Nó vẫn không thể tải đúng cách.

tùy chọn "sản xuất -e" made những RoutingError biến mất.

+2

Chỉ để tham khảo cho các câu trả lời trong tương lai (vì đây có vẻ là một trong những câu trả lời đầu tiên của bạn), nó thường đáng giải thích những gì bạn đang làm và tại sao. –

2

tôi nghĩ rằng để Rails 4.x bạn phải precompile tài sản để sản xuất hoặc sử dụng config.assets.compile thậm chí cả hai nếu cần.

d Hành vi efault Rails cho môi trường sản xuất là "Không dự phòng đường dẫn nội dung nếu tài sản bị biên dịch bị bỏ qua." Vì vậy, đừng. Sử dụng để không compi

config.assets.compile = false 

Nếu bạn sử dụng tùy chọn này bạn không cần phải sử dụng:

config.serve_static_files = true 

Bởi vì nếu tài sản không được biên dịch sẵn, Rails sẽ biên dịch trước khi thực hiện yêu cầu.

Nhưng nếu bạn biên dịch trước nội dung trước khi sản xuất, bạn không cần config.assets.compile = true, nhưng bạn cần config.serve_static_files = true để yêu cầu phân phát Rails nếu bạn không có http_server để phân phát nội dung biên dịch trước.

Cài đặt config.serve_static_assets không còn được dùng nữa.

DEPRECATION WARNING: The configuration option `config.serve_static_assets` has been renamed to `config.serve_static_files` to clarify its role (it merely enables serving everything in the `public` folder and is unrelated to the asset pipeline). The `serve_static_assets` alias will be removed in Rails 5.0. Please migrate your configuration files accordingly. 

Tôi hy vọng câu trả lời này giúp bạn (đọc) để hiểu whats thực sự xảy ra

3

Kiểm tra cho một tập tin như thế này:

public/assets/.sprockets-manifest-3f7771d777ceb581d754e4fad88aa69c.json 

Nếu bạn đang thúc đẩy tài sản precompiled đến một máy chủ sản xuất có là cơ hội để bạn ngăn các tệp 'chấm' ẩn được đẩy và tệp quan trọng này sẽ không đưa tệp đó vào sản xuất.

Trong môi trường của mình, tôi cần phải biên dịch trước các tài sản trong môi trường tích hợp và đẩy chúng vào sản xuất sao cho không cần biên dịch tài sản trên máy sản xuất. Tôi đã chặn nhầm tất cả các tệp bị ẩn khỏi bị đẩy vào máy sản xuất.

Để xem câu trả lời này có phù hợp với bạn không, hãy kiểm tra nguồn HTML được tạo trong trình duyệt từ máy chủ sản xuất để xem đường dẫn nội dung đã được tạo chưa.Nếu bạn thấy thẻ tập lệnh như sau:

<script data-turbolinks-track="true" src="/javascripts/application.js"></script> 

kiểm tra thuộc tính src. Nó sẽ bắt đầu với /assets/javascript. Trong trường hợp này, nó bắt đầu với /javascript cho biết Rails không nghĩ rằng bất kỳ nội dung nào đã được biên dịch trước.

Tôi đã sửa lỗi này bằng cách cập nhật đẩy của tôi sang sản xuất (hiện tại rsync), đảm bảo tôi đẩy tệp .sprockets-manifest* sau khi biên dịch trước trên máy chủ tích hợp của tôi.

Ngoài ra, tôi sử dụng Hành khách độc lập làm máy chủ thử nghiệm tích hợp của tôi, thay vì Webrick, vì nó xử lý các tệp tĩnh thực tế hơn.

10

Như đã lưu ý trước đây config.serve_static_assets không được dùng nữa và được thay thế bằng config.serve_static_files. Nếu chúng ta khảo sát config/environments/production.rb cho Rails-4.2 sau đó người ta tìm thấy này:

# Disable serving static files from the `/public` folder by default since 
    # Apache or NGINX already handles this. 
    config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present? 

Hàm ý là rằng cài đặt và xuất khẩu (trong BASH) biến môi trường export RAILS_SERVE_STATIC_FILES="to any value whatsoever" trong một phiên trước khi chạy rails s -e production sẽ cho kết quả mong muốn khi kiểm tra tại địa phương và cũng sẽ tránh phải nhớ để recode production.rb trước khi đẩy đến các máy chủ sản xuất.

+3

Có một điểm mà tại đó terseness trở thành một fetish. –

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