#brotli #gzip #nginx #apache #命令行工具

程序 static-compress

创建与glob模式匹配的文件的压缩副本,以便通过Web服务器(如nginx或apache)静态地提供压缩文件

10 个版本

使用旧的 Rust 2015

0.3.3 2022年1月19日
0.3.2 2017年8月16日
0.3.1 2017年7月24日
0.2.2 2017年7月21日
0.1.2 2017年7月20日

#458 in 压缩

每月下载 37

MIT 许可证

32KB
510 代码行

static-compress

static-compress 是一个命令行工具,可用于生成指定目录子树的静态预压缩副本,这对于通过Web服务器(如nginx或apache)提供静态预压缩内容非常有用。

static-compress 目前支持创建符合给定glob(表达式)的文件的gzip和brotli格式的静态压缩副本。可以使用标准的 miniz 库或较慢但压缩率更高的 zopfli 算法(由Google最近开发)生成gzip压缩文件。从版本0.3开始,static-compress 还支持 webp 图像压缩。

安装

static-compress 可通过所有支持平台的 cargo 软件包管理器使用,并可以通过简单地执行以下命令进行安装:

cargo install static-compress

可以在静态压缩主页 https://neosmart.net/static-compress/ 上找到为选定平台预构建的签名二进制文件。

使用方法

用法

static-compress [OPTIONS] <FILTER>...

static-compress 的用法简单。可以使用要预压缩的文件列表或表达式(如 *.rs,匹配当前目录中所有扩展名为 .rs 的文件)或 **/*.png(匹配所有子目录中的 .png 文件)来调用它。

不需要选项,但提供可选的命令行开关来影响 static-compress 的行为。

-c, --compressor <[brotli|gzip|            The compressor to use, defaulting to gzip
                   webp|zopfli]>
-e, --extension <.EXT>                     The extension to use for compressed files. Supplied
                                           automatically if not provided.
-j, --threads <COUNT>                      The number of simultaneous conversions
-q, --quality <QUALITY>                    The algorithm-specific quality parameter to be used.
                                           Automatically set if not provided.

可以使用 -j 开关(类似于 make)实现多线程,并可以用于指定多线程同时压缩的文件数。默认情况下,static-compress 只使用一个线程。

可以使用特定于算法的 --quality 开关来设置所选压缩器的质量参数(如果支持)

压缩器 --quality 范围
gzip 0 - 10
brotli 0 - 11
webp 0 - 100
zopfli 不支持

支持的匹配模式/表达式

支持的过滤器/表达式包括 * 用于匹配任何文件名模式,** 用于递归匹配所有子目录,以及 ? 用于替换任意单个字符。包含多个字符的方括号将匹配方括号内的任意一个字符(例如,[abc] 将匹配 ab 但不匹配 aa),并且花括号可以用于匹配以逗号分隔的内容(例如,{abc,def})。

static-compress 支持以下过滤器表达式,它们都会匹配相同的文件 foo.bar

  • ./relative/path/to/foo.bar
  • /absolute/path/to/foo.bar
  • 相对路径/*/*/foo.ba?
  • **/foo.bar
  • **/foo.ba[rz]
  • **/{foo|something}.bar

重要提示:请确保将表达式放在双引号中,以防止您的shell将表达式进行通配符匹配! 例如,使用 static-compress "*.html" 而不是 static-compress *.html。后者可能导致参数溢出,并且不会使用 static-compress 的智能通配符匹配,而是依赖于您的shell来展开通配符!

支持的压缩方法

目前,static-compress 支持通用压缩算法 gzipbrotli,用于压缩网页内容。几乎所有目前使用的Web服务器和Web浏览器都完全支持 gzipbrotli 是由 Google 开发的一种较新的网络压缩格式 Brotli,它可以实现比 gzip 更高的压缩级别,尽管压缩对服务器的性能影响更大。因此,能够预先压缩给定的目录树,而不是每次请求时(重新)压缩文件,是非常有吸引力的。

static-compress 还支持 zopfli,它类似于 gzip -11(《我们只是在开玩笑!》)。唯一的问题是 zopfli 非常慢,绝对不打算用于动态压缩。同样,这也是另一个预压缩是最佳选择的地方,而 static-compress 使准备目录树以提供 zopfli 压缩版本的其内容变得容易。与 brotli 不同,zopfli 与 gzip 兼容,这意味着任何支持 gzip 解压缩的浏览器也支持 zopfli - 但 zopfli 在压缩速度上更慢,并且通常无法实现 brotli 当前所实现的相同压缩率。(考虑到与 90 年代的浏览器良好兼容性的要求,它在所做的事情上做得很好。)

从版本 0.3 开始,static-compress 还增加了对图像压缩的 webp 支持。在我们的测试中,我们使用大约 15,000 张 PNG 和 JPG 格式的图像对 NeoSmart 网站的语料库进行了测试,以 90(static-compress 中 webp 的默认 --quality 参数)作为质量参数的 webp 压缩将文件大小减少了 65%,而没有明显增加损坏。

操作模式

static-compress 是一个用于日常网页部署和系统管理任务的智能压缩工具。使用 static-compress 的全部意义在于与那些非常脆弱且过于复杂的批处理脚本(如使用 findmtimegzip|brotliparalleltouch 等操作)相比,目的是使生活更加便捷,结果更加便携和确定。可以安全地在任何目录树上运行 static-compress,默认情况下它

  • 仅压缩以前未静态压缩的文件(它将文件的静态压缩副本的修改日期设置为与原始文件匹配,只有当它们不匹配时才重新压缩),
  • 不会压缩已压缩的文件(即不会将预压缩的 .gz 文件重新压缩为 .gz.br),
  • 可以根据需要配置使用尽可能多的或尽可能少的线程进行同时压缩,
  • 可以用来压缩整个目录树(static-compress "**")或仅匹配特定扩展名的文件(static-compress "**/*.html")或仅匹配特定前缀或子路径(static-compress "**/tocompress/*"

Web 服务器配置

给定一个子目录 optimized,其内容已通过 static-compress optimized/**static-compress optimized/** -c brotligzipbrotli 格式预压缩,配置您的 Web 服务器以使用原始文件的静态预压缩版本的说明如下

nginx

要服务 gzip 压缩文件,nginx 必须在构建时使用 ngx_http_gzip_static_module 模块(默认分发版中包含)通过指定 --with-http_gzip_static_module。之后,可以使用以下配置

location optimized {
  gzip_static on;
}

要服务 brotli 压缩文件,nginx 必须在构建时使用 ngx_brotli 模块(可单独获取)通过指定 --add-module ../ngx_brotli。之后,可以使用以下配置

location optimized {
  brotli_static on;
}

如果已安装 ngx_brotlingx_http_gzip_static_module 模块,则可以在同一个 location 块中安全地使用这两个指令

location optimized {
  brotli_static on;
  gzip_static on;
}

请注意,这两个模块(brotli_typesgzip_types)的文件类型选项不适用于静态选项;所有文件,即使这些选项没有指定用于动态压缩,也可以以这些格式提供服务,如果同一目录中存在具有相同名称的 .br.gz 文件。

static-compress 在MIT许可协议下免费向公众提供。 static-compress 是开源的,没有 flate2zopfli 库的作者,以及 brotligzipzopfli 算法的原始创建者的贡献,这项工作将不会实现。

static-compress 由 Mahmoud Al-Qudsi 编写 <[email protected]>,在 NeoSmart Technologies 的管理下。名称 static-compress 和 MIT 许可证未授予的所有其他权利均由 NeoSmart Technologies 保留,版权所有,2017。

依赖关系

~12–22MB
~285K SLoC