我已经使用Capistrano 2,Unicorn,Nginx部署了我的RoR 4应用程序。 问题是我在资产(样式表,javascripts)上得到 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;
}
我从哪里开始寻找?
答案 0 :(得分:10)
从access.log看来,你刚刚在你的布局中硬编码了application.css / .js。生产公用文件夹中没有此类文件,因为资产管道给出了它们的指纹名称(请查看示例ls输出)。
您可以阅读此here。
解决问题非常简单。使用以下代码替换application.css / .js的硬编码链接:
<%= javascript_include_tag "application" %>
<%= stylesheet_link_tag "application" %>
答案 1 :(得分:1)
添加到Sergey Moiseev的答案
尝试使用网址直接获取资源 /assets/javascripts/application-d65a0eaefe6ca2eef9400045f94ab52b.js.如果它不起作用,你的问题是在nginx而不是rails。
另外,请检查您是否使用正确的指纹获取文件。在这种情况下,检查其应用程序-d65a0eaefe6ca2eef9400045f94ab52b.js或其他具有不同指纹的application.js。我在多台服务器上遇到了类似的问题。
答案 2 :(得分:1)
对我来说,我的nginx配置中root
路径错误,我遇到了这个问题。参考:https://stackoverflow.com/a/25341195/2544629
答案 3 :(得分:0)
我猜Capistrano没有使用“production”作为Unicorn的环境名称(-E选项)。 “ps aux | grep unicorn”可能会告诉你它正在使用哪个环境。