gsutil rsync 与 gzip 压缩

Posted

技术标签:

【中文标题】gsutil rsync 与 gzip 压缩【英文标题】:gsutil rsync with gzip compression 【发布时间】:2015-09-19 03:05:18 【问题描述】:

我在谷歌存储桶中托管公开可用的静态资源,我想使用gsutil rsync 命令将我们的本地版本同步到存储桶,从而节省带宽和时间。我们构建过程的一部分是对这些资源进行预压缩,但gsutil rsync 无法设置Content-Encoding 标头。这意味着我们必须运行gsutil rsync,然后立即运行gsutil setmeta 来设置所有gzip 文件类型的标题。这会使存储桶处于 BAD 状态,直到设置该标头。另一种选择是使用gsutil cp,通过 -z 选项,但这需要我们每次都重新上传整个目录结构,这包括大量的图像文件和其他非压缩资源,浪费时间和带宽。

是否有一种原子方式来完成 rsync 并设置正确的 Content-Encoding 标头?

【问题讨论】:

太棒了 - 不知道 -z 选项到 cp 【参考方案1】:

假设您从 source-dir 中的 gzip 压缩源文件开始,您可以这样做:

gsutil -h content-encoding:gzip rsync -r source-dir gs://your-bucket

注意:如果你这样做,然后以相反的方向运行 rsync,它将解压缩并复制所有对象:

gsutil rsync -r gs://your-bucket source-dir 

这可能不是您想要发生的。基本上,使用 rsync 最安全的方法是在源和目标之间简单地同步对象,而不是尝试在对象上设置内容编码。

【讨论】:

只有基于文本的文件被压缩的问题,如 CSS、js、html 等。 是否有基于文件扩展名的原子方式来执行此操作?我真的没有办法。 gsutil rsync 的一个很好的补充是传递一个文件扩展名列表,在 rsync 期间可以应用标头。例如,通常使用 gzip 编码的文件只有 html、css、js、json、xml、svg、txt。这是来自用于 deflate 的 apache 配置:httpd.apache.org/docs/current/mod/mod_deflate.html 我们选择不支持使用 rsync 命令进行动态压缩,因为正确执行此操作需要跟踪对象元数据中的预压缩大小和校验和,并可能导致混淆客户端尝试进行多源同步的情况。基本上,如果你想即时压缩,你需要使用 gsutil cp 命令。【参考方案2】:

我没有完全回答这个问题,但我来到这里是因为我想知道同样的事情试图实现以下目标:

如何高效地将静态网站部署到谷歌云存储

我能够找到一种优化方式,将我的静态网站从本地文件夹部署到 gs 存储桶

将我的本地文件夹拆分为 2 个具有相同层次结构的文件夹,一个包含要 gzip 的内容(html、css、js...),另一个包含其他文件 Gzip 我的 gzip 文件夹中的每个文件(就地) 为每个文件夹调用 gsutil rsync 到相同的 gs 目标

当然,这只是一种同步方式,已删除的本地文件不会被远程删除

对于 gzip 文件夹,命令是

gsutil -m -h Content-Encoding:gzip rsync -c -r src/gzip gs://dst

强制压缩内容编码

对于另一个文件夹,命令是

gsutil -m rsync -c -r src/none gs://dst

-m 选项用于并行优化。当我在构建过程中触摸每个本地文件时,需要-c 选项来强制使用校验和验证 (Why is gsutil rsync re-downloading all our files?)。 -r 选项用于递归。

我什至为它写了一个脚本(在 dart 中):http://tekhoow.blogspot.fr/2016/10/deploying-static-website-efficiently-on.html

【讨论】:

以上是关于gsutil rsync 与 gzip 压缩的主要内容,如果未能解决你的问题,请参考以下文章

java GZIP压缩与解压缩

Linux 压缩与解压缩工具gzip/gunzip

Linux命令之tar-rsync

tar与压缩详解

gzip压缩命令

Gzip压缩与解压