世界上最伟大的投资就是投资自己的教育

首页Nginx
随风 · 练气

Nginx 学习笔记系列文章之 Nginx 的 gzip static 模块探索

随风发布于3154 次阅读

本站有一篇文章nginx 之 gzip 压缩提升网站性能 (三)介绍过 nginx 中ngx_http_gzip_module这个模块的使用,这个模块主要是用来压缩静态资源或者任何响应内容的。而这篇文章主要介绍的是ngx_http_gzip_static_module这个模块的使用。

它是这样使用的:

location ~ ^/assets/ {
   gzip_static on;
}

assets目录下有很多静态资源,比如 js,css 等文件。

我们使用 strace 工具来追踪 nginx worker 进程的系统调用。

首先,查看一下 nginx 的进程号。

$ ps -ef | grep nginx
www-data 17187 24035  0 Jan26 ?        00:00:04 nginx: worker process
root     24035     1  0 Jan02 ?        00:00:00 nginx: master process /usr/sbin/nginx

可以看到 nginx 的 worker 进程的 pid 是 17187。

使用 strace 追踪相关的 gz 的信息。

sudo strace -p 17187 2>&1 | grep gz

我们使用 curl 工具尝试访问 assets 目录下的静态资源。

$ curl -I http://www.rails365.net/assets/application-66a0c9fef334cb918dbbe88caf095db309cb3806af50808f7216a500434b96ec.js

可以看到 strace 出现了一行信息。

$ sudo strace -p 17187 2>&1 | grep gz

open("/home/yinsigan/rails365/current/public/assets/application-66a0c9fef334cb918dbbe88caf095db309cb3806af50808f7216a500434b96ec.js.gz", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory)

它会尝试打开找刚才那个 js 的静态文件,不过后面加了 gz 作为后缀,也就是压缩过的文件。这个模块的作用就是首先会去找 gz 文件,找到的话就直接返回给客户端,没有找到,才用ngx_http_gzip_module这个模块压缩之后再返回。毕竟压缩,再怎样还是要消耗内存,消耗 CPU 的,如果原本就有 gz 文件,那肯定是会缩短处理时间的,这也正是这个模块存在的意义。

来看一下 assets 目录下的文件。

~/rails365/current/public/assets$ ls
application-66a0c9fef334cb918dbbe88caf095db309cb3806af50808f7216a500434b96ec.js

可以发现,果然是没有任何 gz 文件存在的。

现在我们来生成 gz 文件,看看 strace 是如何输出的。

我的应用是使用 rails 开发的,下面是一段自动生成 gz 文件脚本,从网上摘录的。

# lib/tasks/assets.rake
namespace :assets do
  desc "Create .gz versions of assets"
  task :gzip : :environment do
    zip_types = /\.(?:css|html|js|otf|svg|txt|xml)$/

    public_assets = File.join(
      Rails.root,
      "public",
      Rails.application.config.assets.prefix)

    Dir["#{public_assets}/**/*"].each do |f|
      next unless f =~ zip_types

      mtime = File.mtime(f)
      gz_file = "#{f}.gz"
      next if File.exist?(gz_file) && File.mtime(gz_file) >= mtime

      File.open(gz_file, "wb") do |dest|
        gz = Zlib::GzipWriter.new(dest, Zlib::BEST_COMPRESSION)
        gz.mtime = mtime.to_i
        IO.copy_stream(open(f), gz)
        gz.close
      end

      File.utime(mtime, mtime, gz_file)
    end
  end

  # Hook into existing assets:precompile task
  Rake::Task["assets:precompile"].enhance do
    Rake::Task["assets:gzip"].invoke
  end
end

生成 gz 文件:

$ mina "rake[assets:gzip]"
~/rails365/current/public/assets$ ls
application-66a0c9fef334cb918dbbe88caf095db309cb3806af50808f7216a500434b96ec.js
application-66a0c9fef334cb918dbbe88caf095db309cb3806af50808f7216a500434b96ec.js.gz

需要注意的事,别对二进制文件,比如图片做 gz 压缩,因为没有任何意义。

再次用 curl 工具访问,可以看到 strace 的输出:

$ sudo strace -p 17187 2>&1 | grep gz
open("/home/yinsigan/rails365/current/public/assets/application-66a0c9fef334cb918dbbe88caf095db309cb3806af50808f7216a500434b96ec.js.gz", O_RDONLY|O_NONBLOCK) = 9

可见,已经不会提示文件找不到了。

完结。

本站文章均为原创内容,如需转载请注明出处,谢谢。

0 条回复
暂无回复~~
相关小书
nginx教程

nginx教程

最全面,最深入的nginx入门到精通的教程

发表于

喜欢
统计信息
    学员: 29915
    视频数量: 1996
    文章数量: 526

© 汕尾市求知科技有限公司 | Rails365 Gitlab | 知乎 | b 站 | csdn

粤公网安备 44152102000088号粤公网安备 44152102000088号 | 粤ICP备19038915号

Top