Rails 3.2资产管道与Thin和Apache,没有找到资产

时间:2012-02-24 20:19:28

标签: ruby-on-rails ruby-on-rails-3 apache asset-pipeline thin

我的问题类似于这个问题Rails 3.2 Asset Pipeline with Passenger Endless Errors,只是当我尝试实际去

<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"):

更新 @Brandan感谢您的帮助。我的资产确实在RAILS_ROOT/public/assets。我把它放在我的Apache vhost文件中:

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 / environments / 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

5 个答案:

答案 0 :(得分:4)

从Apache配置中删除以下行。

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

答案来自In Rails, should I enable serve_static_assets?

答案 1 :(得分:3)

通常,您的资产 仅存在于已部署应用的/public/assets中。

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

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

答案 2 :(得分:2)

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

虽然我也使用Unicorn,但我的配置与您的配置基本相同。

以下是我要做的事情:

  1. 暂时删除以下部分,因为我认为这会导致问题排查:

     <LocationMatch "^/assets/.*$">
      Header unset ETag
        FileETag None
        ExpiresActive On
        ExpiresDefault "access plus 1 year"
      </LocationMatch>
    
  2. 或许把它全部工作然后重新加入。我不认为这是问题的原因,但是,在诊断这样的事情时,最好尽可能多地删除以找到罪魁祸首。

    1. 在公共目录中运行chown -R xxx.xxx(将xxx替换为您的应用程序用户或Web用户)。一旦我这样做了,css又出现了。

    2. (我做了什么但可能不是必需的)你可能也想在没有上限的情况下在本地安装。以防万一有问题。这对我也有用。

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

    4. 重启你的apache服务器几次。

    5. 你可以看到我的conf的要点。 here

答案 3 :(得分:1)

尝试从apache / thin配置中删除ProxyPassProxyPassReverse指令。重写规则中的P标志已经执行了您想要的代理传递。

有关详细信息,请参阅http://httpd.apache.org/docs/2.0/mod/mod_proxy.html

答案 4 :(得分:0)

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

由于权限错误,我报告的错误发生在我身上。 Apache无法提供assets内的文件,但能够在public/上发送文件

在我的情况下,我使用capistrano,因此assetsshared/public/assets的符号链接。

我做的是:

chmod -R o+x shared/ 

列出和访问目录需要x权限。之后它起作用了。您必须确保assets对其他人有+ x