Hegwin.Me

朱雀桥边野草花,乌衣巷口夕阳斜。

Nginx部署时Assets静态文件请求的配置

Handle Assets with Nginx Instead of Thin

将Rails项目部署到production环境时,我在 assets 方面遇到了不少问题。

现在你们看到的Hegwin.me这个博客,我是使用 Nginx 和 Thin 作为服务器部署的。因为部署的频率并不高,所以我基本上都是手动来部署的。在我部署的过程中,当我执行完 RAILS_ENV=production bundle exec rake assets:precompile,并且以production模式启动server后,对 assets(CSS,JS还有图片)的请求,返回的结果全是404 Not Found。

我觉得很不可思议,为什么我使用Unicorn的时候没遇到这种情况呢?

在我的 production 配置下有这么一段:

# Disable Rails's static asset server (Apache or nginx will already do this)
config.serve_static_assets = false

将这里的false改为true也能解决问题,可是这些静态文件还是用Apache或者Nginx来做比较好。

在Rails Guide的 The Asset Pipeline里面写了如何用Nginx去管理,需要在Nginx配置中加上这一段:

location ~ ^/assets/ {
  expires 1y;
  add_header Cache-Control public;

  add_header ETag "";
  break;
}

我把这段复制粘贴之后依然不对,继续返回404。

而后,我在网上搜了之后,看到有的人的解决方式是加入在location配置里加进root来指定public路径,即

location ~ ^/assets/ {
  expires 1y;
  add_header Cache-Control public;
  root /srv/blog/public;

  add_header ETag "";
  break;
}

至此,问题也就解决了。

< Back