【问题标题】:Rails 3.2 Asset Pipeline with Thin and Apache, not finding assets带有 Thin 和 Apache 的 Rails 3.2 资产管道,未找到资产
【发布时间】:2012-03-15 07:10:13
【问题描述】:

我的问题与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 的符号链接。那么到底是什么负责告诉应用在 /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

【问题讨论】:

  • 如何创建链接?
  • 在我的布局中我说&lt;%= stylesheet_link_tag "application", :media =&gt; "all" %&gt;&lt;%= javascript_include_tag "application" %&gt;
  • 您是否预编译了资产?
  • 是的,我有最新的 capistrano 并且正在我的 Capfile 中使用 load 'deploy/assets' 来做到这一点。但即使我手动预编译资产,仍然不行。
  • 也有这个问题。我很想知道原因。

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


【解决方案1】:

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

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

就我而言,我使用 capistrano,所以 assets 是指向 shared/public/assets 的符号链接。

我所做的是:

chmod -R o+x shared/ 

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

【讨论】:

    【解决方案2】:

    从您的 Apache 配置中删除以下行。

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

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

    【讨论】:

    • 这解决了我的问题。谢谢。
    【解决方案3】:

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

    更多信息请参见http://httpd.apache.org/docs/2.0/mod/mod_proxy.html

    【讨论】:

      【解决方案4】:

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

      虽然我也在使用 Unicorn,但我的配置和你的几乎一样。

      这是我所做的排序:

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

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

      也许让它全部工作,然后将其重新添加。我认为这不是问题的原因,但是,在诊断这样的事情时,最好尽可能多地删除以找到罪魁祸首。

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

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

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

      4. 重启 apache 服务器几次。

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

      【讨论】:

      • 您能否阐明“暂时删除该部分”的含义?什么板块?我对这个问题束手无策,我会在这一点上尝试任何事情!
      • 对不起,由于某种原因,我的回答有些遗漏。我会在几秒钟内更新我的答案。我知道你的痛苦......
      • @DelPiero 如果您的问题已经解决,您真的应该接受答案。
      【解决方案5】:

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

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

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

      【讨论】:

      • 是的,重新启动 Apache,Thin,重新启动服务器...同样的结果。
      • 你能通过http://example.com/assets/filename.ext从浏览器访问RAILS_ROOT/public/assets中的其他文件吗?只是 Rails 的编译资产失败了吗?另外,您可以发布您的config/environments/production.rb 吗?我不确定为什么这些请求会影响 Rails。
      • 不,无法访问RAILS_ROOT/public/assets 中的任何文件。他们都是 404。我会用我的production.rb 更新我的帖子。
      • 我正在寻找的行是config.serve_static_assets = false,你已经有了。这听起来像是 Apache 的问题。 RAILS_ROOT/public/assets的所有权和权限是什么?
      • 权限看起来正确,lrwxrwxrwx myuser myuser 其中 myuser 与我在 deploy.rb 中使用的权限相同。 public/assets 中的所有资产都具有这些相同的权限。
      猜你喜欢
      • 2013-01-31
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多