【发布时间】:2013-12-09 15:47:39
【问题描述】:
我有一个堆栈,其中 Rails 和 Unicorn 在 Heroku 上运行,我正在静态提供资产,以便我可以配置 云端。
当 Cloudfront 尝试请求某些资产时 unicorn 引发错误,我检查了 unicorn 的源代码,显然 body 带有 nil 值,最有趣的部分是当资产是从站点内部请求的,在浏览器中,它们的服务很好。我还运行了curl mypage.com/assets/some_asset.css,它在 Rails 的日志中引发了完全相同的错误。以下是 Rails 日志中显示的错误以及我从机器上运行 curl 时遇到的错误。
2013-12-09T15:43:25.758765+00:00 app[web.1]: E, [2013-12-09T15:43:25.758676 #15] ERROR -- : app error: undefined method `each' for nil:NilClass (NoMethodError)
2013-12-09T15:43:25.758842+00:00 app[web.1]: E, [2013-12-09T15:43:25.758775 #15] ERROR -- : /app/vendor/bundle/ruby/2.0.0/gems/unicorn-4.7.0/lib/unicorn/http_response.rb:60:in `http_response_write'
2013-12-09T15:43:25.758892+00:00 app[web.1]: E, [2013-12-09T15:43:25.758811 #15] ERROR -- : /app/vendor/bundle/ruby/2.0.0/gems/unicorn-4.7.0/lib/unicorn/http_server.rb:590:in `process_client'
2013-12-09T15:43:25.758936+00:00 app[web.1]: E, [2013-12-09T15:43:25.758868 #15] ERROR -- : /app/vendor/bundle/ruby/2.0.0/gems/unicorn-4.7.0/lib/unicorn/http_server.rb:660:in `worker_loop'
2013-12-09T15:43:25.759023+00:00 app[web.1]: E, [2013-12-09T15:43:25.758945 #15] ERROR -- : /app/vendor/bundle/ruby/2.0.0/gems/unicorn-4.7.0/lib/unicorn/http_server.rb:527:in `spawn_missing_workers'
2013-12-09T15:43:25.759023+00:00 app[web.1]: E, [2013-12-09T15:43:25.758991 #15] ERROR -- : /app/vendor/bundle/ruby/2.0.0/gems/unicorn-4.7.0/lib/unicorn/http_server.rb:153:in `start'
2013-12-09T15:43:25.759023+00:00 app[web.1]: E, [2013-12-09T15:43:25.759016 #15] ERROR -- : /app/vendor/bundle/ruby/2.0.0/gems/unicorn-4.7.0/bin/unicorn:126:in `<top (required)>'
2013-12-09T15:43:25.759089+00:00 app[web.1]: E, [2013-12-09T15:43:25.759041 #15] ERROR -- : /app/vendor/bundle/ruby/2.0.0/bin/unicorn:23:in `load'
2013-12-09T15:43:25.759089+00:00 app[web.1]: E, [2013-12-09T15:43:25.759066 #15] ERROR -- : /app/vendor/bundle/ruby/2.0.0/bin/unicorn:23:in `<main>'
我从 curl 得到的错误:
HTTP/1.1 500 Internal Server Error
curl: (18) transfer closed with 4283 bytes remaining to read
这可能是由于 unicorn 的配置设置为 30 秒,但错误发生得非常快,甚至不到一秒。
编辑 I:因为我正在使用 Heroku,并且我的应用程序有 大量资产,所以不可能在 Heroku 超时之前编译所有这些资产,因此我在本地编译资产并将它们推送到 Heroku。
【问题讨论】:
-
所以当您将资产部署到 Heroku 时,您正在预编译资产,对吧?
-
是的,没错。它们都是预编译的。
-
您应该使用 Chrome 的检查器看到浏览器提供的样式表的名称。您会看到 Rails 已将一些字符串附加到您的 CSS 文件以破坏浏览器缓存。
-
使用 curl -v 和 Chrome 的开发者工具来获得两种情况下完整的原始请求。将它们粘贴到此处。
标签: ruby-on-rails heroku asset-pipeline unicorn