【问题标题】:Assets not served with RoR 4, Nginx, UnicornRoR 4、Nginx、Unicorn 未提供的资产
【发布时间】:2014-04-21 11:58:20
【问题描述】:

我已经使用 Capistrano 2、Unicorn、Nginx 部署了我的 RoR 4 应用程序。 问题是我在资产(样式表、javascript)上得到 404

这是 Nginx 访问日志:

89.0.40.233 - - [16/Mar/2014:08:24:26 +0000] "GET /stylesheets/application.css HTTP/1.1" 404 650 "http://host.cloudapp.net/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36"
89.0.40.233 - - [16/Mar/2014:08:24:26 +0000] "GET /javascripts/application.js HTTP/1.1" 404 650 "http://host.cloudapp.net/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36"

我的资产在 app 文件夹中:

azureuser@host:~/apps/testify/current/public$ ls -a assets
.                                                    application-d65a0eaefe6ca2eef9400045f94ab52b.js
..                                                   application-d65a0eaefe6ca2eef9400045f94ab52b.js.gz
application-71e2591e9586afebf3fb4ff70aaae199.css     manifest-a348973e84698f7d898e8021bd6e5388.json
application-71e2591e9586afebf3fb4ff70aaae199.css.gz

我的 Nginx 配置:

upstream unicorn {
  server unix:/tmp/unicorn.testify.sock fail_timeout=0;
}

server {
  listen 80 default deferred;
  root /home/azureuser/apps/testify/current/public;

  location ^~ /assets/ {
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://unicorn;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}

我从哪里开始寻找?

【问题讨论】:

  • 您找到解决方案了吗?

标签: ruby-on-rails nginx capistrano unicorn


【解决方案1】:

对我来说,root 路径在我的 nginx 配置中是错误的,我遇到了这个确切的问题。参考:https://stackoverflow.com/a/25341195/2544629

【讨论】:

    【解决方案2】:

    添加到 Sergey Moiseev 的答案

    尝试直接使用 url 获取资产 /assets/javascripts/application-d65a0eaefe6ca2eef9400045f94ab52b.js。如果它不起作用,则您的问题出在 nginx 而不是 rails 上。

    另外请检查您是否使用正确的指纹获取文件。在这种情况下,请检查其 application-d65a0eaefe6ca2eef9400045f94ab52b.js 或其他具有不同指纹的 application.js。我在多台服务器上遇到了类似的问题。

    【讨论】:

      【解决方案3】:

      我猜 Capistrano 没有使用“生产”作为 Unicorn 的环境名称(-E 选项)。 "ps aux|grep unicorn" 可能会告诉你它正在使用哪个环境。

      【讨论】:

        【解决方案4】:

        从 access.log 看来,您只是在布局中硬编码 application.css/.js。由于资产管道为它们提供的指纹名称,生产公共文件夹中没有此类文件(查看您的示例 ls 输出)。

        您可以阅读此here

        解决您的问题非常简单。用以下代码替换 application.css/.js 的硬编码链接:

        <%= javascript_include_tag "application" %>
        <%= stylesheet_link_tag "application" %>
        

        【讨论】:

        • 更进一步,链接指向 /javascripts 和 /stylesheets,但 Nginx 配置仅匹配 /assets,这是链接和包含标签指向的内容。
        • 恐怕不是这样的。我会调查@rosenfeld 的答案。
        猜你喜欢
        • 2014-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-07
        • 2014-10-10
        • 2011-09-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多