nginx gzip_static:为什么需要非压缩文件?

tom*_*ave 7 nginx gzip

我正在使用在Ubuntu 12.04.4上运行的nginx 1.4.4。 nginx 反向代理一组Rails应用程序服务器。

直接提供静态文件(主要是资产),而不会影响应用程序服务器。
我已将其设置为gzip响应并在可用时使用预压缩文件。

http {
  gzip on;
  gzip_http_version 1.0;
  gzip_proxied any;
  # other ngx_http_gzip_module directives...

  server {
    # proxy configuration

    location ^~ /assets/ {
      gzip_static on;
      expires max;
      add_header Cache-Control public;
      # root is inherited
      try_files $uri =404;
      error_page 404 /404.html;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这有效。
我已经使用真实的预压缩资产和具有相同名称但内容不同的虚拟非压缩资产对其进行了测试:

/assets/application-a45d6...e2593.css         # dummy content
/assets/application-a45d6...e2593.css.gz      # real CSS
Run Code Online (Sandbox Code Playgroud)

我可以看到这种切换,gzip_static onoff会导致 nginx 正确提供文件的预期版本。
到现在为止还挺好。

但是,此设置仅在文件的非压缩版本也存在时才有效。只有预压缩版本会导致 404。

文件说:

gzip_static
使用“always”值(1.3.6),在所有情况下都使用 gzip 压缩文件,而不检查客户端是否支持它。如果磁盘上没有任何未压缩的文件或者使用了 ngx_http_gunzip_module,这很有用。

(是的:我都试过onand always,我也试过添加gunzip on。没有任何改变)

这似乎表明只有文件的压缩版本是可以的。真的是这样吗?我的配置有什么问题吗?

Mic*_*ton 7

您可能发现了一个错误。但总的来说,您无论如何都需要这两个文件,原因有以下三个:

  1. 一些客户端不会请求压缩数据,如果你强加给他们,gzip_static always;他们可能无法理解。
  2. 确保始终找到该文件,并且请求不会被上游传递到 Rails 或被 404 处理程序捕获(可能的错误)。其中之一可能是正在发生的事情。
  3. 让 nginx 在运行时压缩或解压缩文件意味着它必须重复执行此操作,从而消耗可用于运行应用程序的宝贵 CPU。简单地发送静态资源对 CPU 的占用要少得多。

  • `try_files` 在 `gzip_static` 之前工作,因此它寻找未压缩的文件。 (4认同)

hen*_*dry 6

Nginx 1.6 不需要解压缩文件:

    location ~ \.txt$ {
        gzip_static on;
        gunzip on;
    }
Run Code Online (Sandbox Code Playgroud)

无论curl http://localhost/index.txtcurl -H "Accept-Encoding: gzip" http://localhost/index.txt | gunzip现在的工作罚款只是/srv/www/localhost/index.txt.gz在我的根目录。

  • [`gunzip`](http://nginx.org/r/gunzip) 指令相对较新。它在 1.6 稳定版本之前有一些错误。无论如何,如果你有额外的 CPU 可以花在它上面,那就继续吧,但是让资源已经(未)压缩并且可用于 [`sendfile()`](http://nginx.org) 几乎总是更快/r/sendfile) 立即。 (4认同)
  • 在 Linux 服务器上,最常访问/最近的文件缓存在 RAM 上,因此,在进行基准测试时,在第一个请求之后,后续请求也将从 RAM 中读取文件的内容。因此,我的结论是,同时压缩和未压缩是最佳选择,因为不涉及 CPU 时间,而且实际上大多数请求 (+99.999%) 都不会出现缓慢的磁盘 I/O。 (2认同)