我的问题类似于这个问题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
答案 0 :(得分:4)
从Apache配置中删除以下行。
ProxyPass / balancer://thinservers/
ProxyPassReverse / balancer://thinservers/
答案 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,但我的配置与您的配置基本相同。
以下是我要做的事情:
暂时删除以下部分,因为我认为这会导致问题排查:
<LocationMatch "^/assets/.*$">
Header unset ETag
FileETag None
ExpiresActive On
ExpiresDefault "access plus 1 year"
</LocationMatch>
或许把它全部工作然后重新加入。我不认为这是问题的原因,但是,在诊断这样的事情时,最好尽可能多地删除以找到罪魁祸首。
在公共目录中运行chown -R xxx.xxx(将xxx替换为您的应用程序用户或Web用户)。一旦我这样做了,css又出现了。
(我做了什么但可能不是必需的)你可能也想在没有上限的情况下在本地安装。以防万一有问题。这对我也有用。
完全删除tmp / cache和public / *以防万一。
重启你的apache服务器几次。
你可以看到我的conf的要点。 here
答案 3 :(得分:1)
尝试从apache / thin配置中删除ProxyPass
和ProxyPassReverse
指令。重写规则中的P标志已经执行了您想要的代理传递。
有关详细信息,请参阅http://httpd.apache.org/docs/2.0/mod/mod_proxy.html。
答案 4 :(得分:0)
Passanger知道它的RoR应用程序,因为有一个config.ru文件。
由于权限错误,我报告的错误发生在我身上。 Apache无法提供assets
内的文件,但能够在public/
上发送文件
在我的情况下,我使用capistrano,因此assets
是shared/public/assets
的符号链接。
我做的是:
chmod -R o+x shared/
列出和访问目录需要x权限。之后它起作用了。您必须确保assets
对其他人有+ x