企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 14. gzip static 模块探索 本站有一篇文章[nginx之gzip压缩提升网站性能(三)](http://www.rails365.net/articles/nginx-zhi-gzip-ya-suo-ti-sheng-wang-zhan-xing-neng-san)介绍过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 ``` 可见,已经不会提示文件找不到了。 完结。