【问题标题】:Get NGINX to serve .gz compressed asset files获取 NGINX 以提供 .gz 压缩资产文件
【发布时间】:2011-10-20 15:01:07
【问题描述】:

Rails 3.1 有一个方便的系统,可以将文件压缩成 .gz 文件。但是,我所做的是将使用 assets:precompile 创建的所有资产文件移动到静态网络服务器。这一切都有效,但我怎样才能让 nginx 正常提供 .gz 文件?

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-3 nginx gzip assets


【解决方案1】:

1) 确保您的 Nginx > 1.2.x(以正确修改标头)并使用 --with-http_gzip_static_module 选项进行编译

2) 启用此选项 gzip on(使用 gzip 标头提供后端响应)

3) 使用 gzip_static 设置资产位置 (直接提供 all.css.gz, all.js.gz 文件)

4) 防止资产的 etag 生成和最后修改计算

5) 打开正确的 Cache-control 以缓存 SSL 服务的静态资产, 除非它们会在浏览器关闭后过期

  location ~ ^/(assets|images|javascripts|stylesheets|swfs|system)/ {
      gzip_static on;
      expires     max;
      add_header  Cache-Control public;
      add_header  Last-Modified "";
      add_header  ETag "";
  }

如果您想获得完整的 Nginx 配置,可以查看this gist on Github

open_file_cache 帮助您缓存:打开的文件描述符、它们的大小、修改时间和目录查找,这有助于文件系统的高负载。

更新:如果您生活在边缘,请打开 SPDY 以增强 SSL 连接。

【讨论】:

  • 不要忘记关闭任何资产日志:access_log /dev/null; error_log /dev/null;
  • 使用/dev/null,因为“off”无论如何都是一个文件
  • 如果你想关闭错误日志,你只需要使用 /dev/null (你真的不应该这样做)。 access_log 接受一个 'off' 参数,它实际上关闭了日志记录,所以这些行甚至不会首先生成。
  • 为了最小化文件系统的负载,不要忘记使用 noatime 选项挂载设备。它将防止每次访问时更新每个资产的访问时间。
  • 根据您的情况,您可能希望从 gzip 列表中删除图像。它没有多大帮助,而且吃CPU。最好在上传到服务器之前压缩它们。