Octopress 加速 - 对静态资源预 Gzip 压缩

/

Nginx 等 HTTP 服务器加载了 Gzip 模块都可以开启对静态资源的压缩,减少与客户端间的传输消耗,那为什么还要实行预 Gzip 压缩呢?这么做的好处是:节省了服务器压缩静态资源的开销,同时预压缩可以提供最大压缩比。

新建 rake 任务如下:

require "parallel"
require "zlib"

desc "Gzip static files"
task :gzip, :dir do |t, args|
  puts "## Gzip Static Files"
  args.with_defaults(:dir => "#{public_dir}")
  Parallel.map(Dir.glob("#{args.dir}/**/*.{html,css,xml,packed.js,eot,ttf,otf,svg}"), :in_threads => n_cores) do |f|
    open(f) do |src|
      Zlib::GzipWriter.open("#{f}.gz", Zlib::BEST_COMPRESSION) do |gz|
        gz.puts src.read
      end
    end
  end
end

用到了 2 个 Gem,zlib 用于压缩,parallel 添加并行处理能力。除了 html、xml、css、js 等一般静态资源文件外,也对 eot、otf、otf、svg 进行压缩(woff 已经是压缩格式,所以不再压缩)。

rake deploy 中自动调用:

desc "Default deploy task"
task :deploy do
  # Check if preview posts exist, which should not be published
  if File.exists?(".preview-mode")
    puts "## Found posts in preview mode, regenerating files ..."
    File.delete(".preview-mode")
    Rake::Task[:generate].execute
  end

  # Apply custom tasks
  Rake::Task[:minify_html].execute
  Rake::Task[:gzip].execute

  Rake::Task[:copydot].invoke(source_dir, public_dir)
  Rake::Task["#{deploy_default}"].execute
end

minify_html 任务在另一篇文章 Octopress 加速 - 压缩 Html 中构建。

服务器端 Nginx 需进行相应设置,开启 gzip_static 模块:

location ~* \.(svg|eot|ttf|otf)(\?.*)?$ {
    gzip_static on;
    expires max;
    access_log off;
    log_not_found off;
}

location ~* \.(css|js)(\?.*)?$ {
    gzip_static on;
    expires 7d;
    log_not_found off;
}

location ~* \.(html|xml)$ {
    gzip_static on;
    expires -1;
    log_not_found off;
}

Comments