2012-02-24 116 views
9

我的问题是类似这样的Rails 3.2 Asset Pipeline with Passenger Endless Errors不同之处在于当我试图真正去的Rails 3.2资产管道薄壁和Apache,没有找到资产

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

,我收到了404.这是我不要的东西”不明白。它正在寻找/ assets /,但是当我查看已部署的代码时,资产只在/ public/assets中,这实际上是/ var/www/myapp/shared/assets的符号链接。那么世界上有什么人负责告诉应用程序,查看/资产会产生正确的结果?

我正在使用Rails 3.2.0,ruby-1.9.3-p125,部署到Ubuntu,Apache和Thin。

我应该澄清:我的资产确实部署到服务器。一切都很好,直到他们需要服务,在这种情况下,production.log告诉我它正在/assets/application-eed7996ee9017637f923133371ab3e92.css中寻找它们,这是404的。

为每个请求我thin.log

cache: [GET /] miss 

production.log

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

UPDATE 的帮助@Brandan感谢。我的资产确实在RAILS_ROOT/public/assets。我把这个在我的Apache的虚拟主机文件:

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 /配置/环境/ production.rb设置:

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

您如何创建您的链接? – apneadiving 2012-02-24 20:31:18

+0

在我的布局中我说'<%= stylesheet_link_tag“application”,:media =>“all”%>'和'<%= javascript_include_tag“应用程序”%>' – DelPiero 2012-02-24 21:18:16

+0

您是否预编译了您的资产? – ka8725 2012-02-24 22:30:11

回答

2

我一直有这个问题好几天了。认为这是capistrano或ruby版本的问题,但我很确定它的权限也是相关的。

我的配置和你的配置差不多,尽管我也在使用Unicorn。

这里就是我所做的排序:

  1. 暂时删除以下部分,因为我觉得与故障排除这是造成问题:

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

也许得到它的所有工作和然后将其添加回来。但我认为这不是问题的原因,但在诊断这样的事情时,最好尽可能多地删除找到的罪魁祸首。

  1. 在公用目录上运行chown -R xxx.xxx(用您的应用程序用户或Web用户替换xxx)。一旦我这样做了,CSS再次出现了。

  2. (我做了什么,但可能不是必需的)您可能还想在本地安装而无需使用上限。以防万一它有问题。这也适用于我。

  3. 完全清除tmp/cache和public/*以防万一。

  4. 重新启动你的Apache服务器几次。

你可以看到我的conf的一个要点。 here

+0

你能否澄清你的意思是“暂时删除该部分”?什么部分?我在这个问题的智慧结束,我会尝试在这一点上! – DelPiero 2012-02-26 23:49:35

+0

对不起,由于某种原因,我的答案有点遗漏。我会在几个更新我的答案。我知道你的痛苦... – simonmorley 2012-02-27 08:04:52

+0

@DelPiero如果你的问题得到解决,你应该真的接受答案。 – simonmorley 2012-02-29 19:20:53

3

通常情况下,你的资产应该仅在/public/assets存在一部署应用程序

Apache应配置为使其DocumentRoot是您的RAILS_ROOT/public。然后它将从RAILS_ROOT/public/assets/whatever.css服务http://example.com/assets/whatever.css,并且永远不会通过Rails获取静态资产。

自从您预编译资产后,您是否重新启动了应用程序?有时候,Rails期望你的资产的编译版本比目前部署的更旧/更新。

+0

是的,重新启动Apache,瘦,重新启动服务器...相同的结果。 – DelPiero 2012-02-25 19:42:39

+0

你能通过'http:// example.com/assets/filename.ext'从浏览器访问'RAILS_ROOT/public/assets'中的其他文件吗?这只是Rails的编译资产失败吗?另外,你可以发布你的'config/environments/production.rb'吗?我不确定为什么这些请求完全触及Rails。 – Brandan 2012-02-25 20:08:49

+0

不能,不能访问任何位于'RAILS_ROOT/public/assets'中的文件。他们都是404.我会用我的'production.rb'来更新我的帖子。 – DelPiero 2012-02-25 20:49:51

0

Passanger知道它的RoR应用程序,因为有一个config.ru文件。

由于权限错误,您报告的同一错误发生在我身上。阿帕奇无法满足内部assets文件,但能够发送的文件上public/

在我来说,我使用Capistrano的这么assets是一个符号链接shared/public/assets

我所做的是:

chmod -R o+x shared/ 

X权限要求列出和访问的目录。之后,它的工作。您必须确定assets对其他人有+ x