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 压缩的主要内容,如果未能解决你的问题,请参考以下文章