2012-02-24 34 views
9

Câu hỏi của tôi là tương tự với trang này Rails 3.2 Asset Pipeline with Passenger Endless Errors ngoại trừ việc khi tôi cố gắng để thực sự đi đếnRails 3.2 Asset đường ống với Thin và Apache, không tìm thấy tài sản

<link href="/assets/application-eed7996ee9017637f923133371ab3e92.css" media="all" rel="stylesheet" type="text/css" /> 

tôi nhận được một 404. Dưới đây là những điều tôi don' Tôi hiểu. Nó đang tìm trong/asset /, nhưng khi tôi nhìn vào mã đã được triển khai, các tài sản chỉ nằm trong/public/assets, mà thực sự là một liên kết tượng trưng đến/var/www/myapp/shared/assets. Vì vậy, những gì trên thế giới có trách nhiệm nói cho ứng dụng tìm kiếm/tài sản sẽ tạo ra kết quả chính xác?

Tôi đang sử dụng Rails 3.2.0, ruby-1.9.3-p125, triển khai lên Ubuntu, Apache và Thin.

Tôi nên làm rõ: Tài sản của tôi thực sự được triển khai cho máy chủ. Tất cả mọi thứ hoạt động hoàn toàn tốt đẹp cho đến khi chúng cần được phục vụ, trong trường hợp production.log nói với tôi rằng nó đang tìm kiếm chúng trong /assets/application-eed7996ee9017637f923133371ab3e92.css, trong đó 404.

Đối với mỗi yêu cầu của tôi thin.log nói

cache: [GET /] miss 

production.log nói

ActionController::RoutingError (No route matches [GET] "/assets/application-abecf2e096af9ee80697fd49e79a55e7.js"): 

CẬP NHẬT nhờ @Brandan cho sự giúp đỡ. Tài sản của tôi thực sự ở số RAILS_ROOT/public/assets. Tôi đặt này trong file vhost Apache của tôi:

DocumentRoot /var/rails/myappname/current/public 

RewriteEngine On 
XSendFile On 
XSendFilePath /var/rails/myappname #not even sure if this line is needed 

<LocationMatch "^/assets/.*$"> 
    Header unset ETag 
    FileETag None 
    ExpiresActive On 
    ExpiresDefault "access plus 1 year" 
</LocationMatch> 

RAILS_ROOT/config/môi trường/production.rb thiết lập của tôi:

config.cache_classes = true 
config.consider_all_requests_local = false 
config.action_controller.perform_caching = true 
config.serve_static_assets = false 
config.assets.compress = true 
config.assets.compile = false 
config.assets.digest = true 
config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache 
+0

làm cách nào để bạn tạo liên kết của mình? – apneadiving

+0

trong bố cục của tôi, tôi nói '<% = stylesheet_link_tag" application ",: media =>" all "%>' và '<% = javascript_include_tag" application "%>' – DelPiero

+0

Bạn có biên dịch trước tài sản của mình không? – ka8725

Trả lời

2

Tôi đã gặp sự cố này trong nhiều ngày nay. Nghĩ rằng đó là một vấn đề với capistrano hoặc phiên bản ruby ​​tuy nhiên tôi khá chắc chắn đó là quyền liên quan quá.

Cấu hình của tôi khá giống với bạn mặc dù tôi cũng sử dụng Unicorn.

Đây là những gì tôi đã làm để sắp xếp:

  1. Tạm thời loại bỏ các phần sau đây vì tôi nghĩ rằng vấn đề đã gây ra với các xử lý sự cố:

    <LocationMatch "^/assets/.*$"> 
        Header unset ETag 
        FileETag None 
        ExpiresActive On 
        ExpiresDefault "access plus 1 year" 
        </LocationMatch> 
    

lẽ cho nó tất cả làm việc và sau đó thêm nó trở lại. Tôi không nghĩ rằng đó là nguyên nhân của vấn đề tuy nhiên, khi chẩn đoán những thứ như thế này, tốt nhất là loại bỏ càng nhiều càng tốt để tìm ra thủ phạm.

  1. Chạy chown -R xxx.xxx (thay thế xxx bằng người dùng ứng dụng hoặc người dùng web) trên thư mục công cộng. Ngay sau khi tôi làm như vậy, css xuất hiện lần nữa.

  2. (Những gì tôi đã làm nhưng có thể không cần thiết) Bạn cũng có thể muốn cài đặt cục bộ mà không có giới hạn. chỉ trong trường hợp có vấn đề với nó. Điều đó cũng làm việc cho tôi.

  3. Tẩy sạch hoàn toàn tmp/bộ nhớ cache và công khai/* chỉ trong trường hợp.

  4. Khởi động lại máy chủ apache của bạn một vài lần.

Bạn có thể thấy một ý chính về sự nhầm lẫn của tôi. here

+0

bạn có thể làm rõ ý bạn bằng cách "Tạm thời loại bỏ phần" không? Phần nào? Tôi đang ở cuối wit của tôi với vấn đề này, tôi sẽ cố gắng bất cứ điều gì vào thời điểm này! – DelPiero

+0

Xin lỗi, vì một số lý do có một chút thiếu từ câu trả lời của tôi. Tôi sẽ cập nhật câu trả lời của tôi trong một vài. Tôi biết nỗi đau của bạn ... – simonmorley

+0

@DelPiero Bạn thực sự nên chấp nhận câu trả lời nếu vấn đề của bạn đã được giải quyết. – simonmorley

3

Thông thường, tài sản của bạn nên chỉ tồn tại trong /public/assets cho một ứng dụng được triển khai.

Apache nên được định cấu hình sao cho số DocumentRoot của bạn là RAILS_ROOT/public. Sau đó, nó sẽ phục vụ http://example.com/assets/whatever.css từ RAILS_ROOT/public/assets/whatever.css và không bao giờ chuyển qua Rails cho nội dung tĩnh.

Bạn đã khởi động lại ứng dụng của mình từ khi bạn biên dịch trước tài sản của mình chưa? Đôi khi Rails đang mong đợi phiên bản tài sản cũ hơn/mới hơn được biên dịch của bạn so với hiện đang được triển khai.

+0

có, khởi động lại Apache, Thin, khởi động lại máy chủ ... cùng một kết quả. – DelPiero

+0

Bạn có thể truy cập các tệp khác nằm trong 'RAILS_ROOT/public/asset' từ trình duyệt thông qua' http: // example.com/assets/filename.ext' không? Nó chỉ là tài sản biên dịch của Rails đang thất bại? Ngoài ra, bạn có thể đăng 'config/environment/production.rb' của mình không? Tôi không chắc tại sao những yêu cầu này lại đang đánh Rails. – Brandan

+0

Không, không thể truy cập bất kỳ tệp nào tồn tại trong 'RAILS_ROOT/public/assets'. Tất cả đều là 404. Tôi sẽ cập nhật bài đăng của mình bằng 'production.rb'. – DelPiero

1

Thử xóa các chỉ thị ProxyPassProxyPassReverse khỏi cấu hình apache/mỏng của bạn. Cờ P trong quy tắc viết lại của bạn đã thực hiện đường truyền proxy mà bạn mong muốn.

Xem http://httpd.apache.org/docs/2.0/mod/mod_proxy.html để biết thêm thông tin.

4

Xóa các dòng sau khỏi cấu hình Apache của bạn.

ProxyPass/balancer://thinservers/ 
ProxyPassReverse/balancer://thinservers/ 

Câu trả lời đến từ In Rails, should I enable serve_static_assets?.

+0

Điều này đã khắc phục được sự cố của tôi. Cảm ơn bạn. – blockloop

0

Passanger biết ứng dụng RoR của nó vì có tệp config.ru.

Lỗi tương tự mà bạn đang báo cáo xảy ra với tôi do quyền sai. Apache đã không thể để phục vụ các tập tin bên trong assets, nhưng đã có thể gửi các tập tin trên public/

Trong trường hợp của tôi, tôi sử dụng capistrano nên assets là một liên kết tượng trưng đến shared/public/assets.

những gì tôi đã làm là:

chmod -R o+x shared/ 

x quyền được yêu cầu phải liệt kê các thư mục và truy cập. Sau đó nó hoạt động. Bạn phải đảm bảo rằng assets có + x cho người khác

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